Translate

lunes, 16 de junio de 2025

¿Qué es fixed en C#?


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.