Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La fixed instrucción impide que el recolector de elementos no utilizados reubicale una variable moveble y declare un puntero a esa variable. La dirección de una variable fija o anclada no cambia durante la ejecución de la instrucción . Solo puede usar el puntero declarado dentro de la instrucción correspondiente fixed . El puntero declarado es de solo lectura y no se puede modificar:
unsafe
{
byte[] bytes = [1, 2, 3];
fixed (byte* pointerToFirst = bytes)
{
Console.WriteLine($"The address of the first array element: {(long)pointerToFirst:X}.");
Console.WriteLine($"The value of the first array element: {*pointerToFirst}.");
}
}
// Output is similar to:
// The address of the first array element: 2173F80B5C8.
// The value of the first array element: 1.
Nota:
Puede usar la fixed instrucción solo en un contexto no seguro . El código que contiene bloques no seguros debe compilarse con la opción del compilador AllowUnsafeBlocks.
Puede inicializar el puntero declarado de la siguiente manera:
Con una matriz, como se muestra al principio de este artículo. El puntero inicializado contiene la dirección del primer elemento de matriz.
Con una dirección de una variable. Use el operador address-of
&, como se muestra en el ejemplo siguiente:unsafe { int[] numbers = [10, 20, 30]; fixed (int* toFirst = &numbers[0], toLast = &numbers[^1]) { Console.WriteLine(toLast - toFirst); // output: 2 } }Los campos de objeto son otro ejemplo de variables desplazables que se pueden anclar.
Cuando el puntero inicializado contiene la dirección de un campo de objeto o un elemento de matriz, la
fixedinstrucción garantiza que el recolector de elementos no utilizados no reubica ni elimina la instancia de objeto contenedor durante la ejecución del cuerpo de la instrucción.Con la instancia del tipo que implementa un método denominado
GetPinnableReference. Ese método debe devolver unarefvariable de un tipo no administrado. Los tipos System.Span<T> de .NET y System.ReadOnlySpan<T> hacen uso de este patrón. Puede anclar instancias de intervalo, como se muestra en el ejemplo siguiente:unsafe { int[] numbers = [10, 20, 30, 40, 50]; Span<int> interior = numbers.AsSpan()[1..^1]; fixed (int* p = interior) { for (int i = 0; i < interior.Length; i++) { Console.Write(p[i]); } // output: 203040 } }Para más información, consulte la referencia de API Span<T>.GetPinnableReference() .
Con una cadena, como se muestra en el ejemplo siguiente:
unsafe { var message = "Hello!"; fixed (char* p = message) { Console.WriteLine(*p); // output: H } }Con un búfer de tamaño fijo.
Puede asignar memoria en la pila, donde no está sujeta a la recolección de elementos no utilizados y, por tanto, no es necesario anclarla. Para ello, use una stackalloc expresión .
También puede usar la fixed palabra clave para declarar un búfer de tamaño fijo.
Especificación del lenguaje C#
Para más información, vea las secciones siguientes de la Especificación del lenguaje C#: