La palabra clave fixed en C# se usa en dos contextos, ambos relacionados con el trabajo de bajo nivel y el manejo de memoria no administrada (unsafe code).
Para obtener un puntero fijo a una variable administrada
En C#, los objetos administrados pueden moverse en memoria (por el Garbage Collector). Si queremos trabajar con punteros (como en C o C++), necesitamos asegurarnos de que el objeto no se mueva durante el uso del puntero.
Ahí entra fixed, le indica al runtime que fije el objeto en memoria.
unsafe
{
int[] numeros = { 1, 2, 3, 4 };
fixed (int* p = numeros)
{
for (int i = 0; i < 4; i++)
{
Console.WriteLine(*(p + i));
}
}
}
- fixed bloquea el arreglo numeros en memoria.
- int* p es un puntero al primer elemento.
- Mientras esté dentro del bloque fixed, numeros no se moverá.
Para fijar buffers dentro de structs fixed size buffer
C# permite declarar buffers de tamaño fijo dentro de structs cuando estás trabajando en código unsafe.
unsafe struct MiBuffer
{
public fixed byte datos[10];
}
- Aquí datos es un array de 10 bytes directamente dentro del struct.
- Es muy usado cuando interoperás con código nativo o estructuras de bajo nivel.
Cosas importantes:
- Solo se puede usar fixed dentro de código marcado como unsafe.
- Necesitás habilitar la opción /unsafe en el compilador o el flag en el proyecto.
- Ayuda a interoperar con APIs nativas, como Win32, o trabajar con bloques de memoria directamente.
- No es algo común en código de negocio habitual en C#, pero sí muy usado en interop, performance crítica o trabajo con hardware.