Pregunta

Tenemos un código similar al siguiente en uno de nuestros proyectos. ¿Alguien puede explicar (en inglés simple) por qué se necesita la declaración fija aquí?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
¿Fue útil?

Solución

Corrige el puntero en la memoria. Los idiomas de recolección de basura tienen la libertad de mover objetos alrededor de la memoria para mayor eficiencia. Todo esto es transparente para el programador porque realmente no usan punteros en " normal " Código CLR. Sin embargo, cuando necesita punteros, debe corregirlos en la memoria si desea trabajar con ellos.

Otros consejos

La declaración fija hará " pin " ; La variable en la memoria para que el recolector de basura no se mueva alrededor al recolectar. Si moviera la variable, el puntero se volvería inútil y cuando lo usas estarías intentando acceder o modificar algo que no tenías intención de hacer.

Lo necesitas en cualquier lugar donde hagas aritmética de punteros, para evitar que el recolector de basura se mueva sobre ti.

Debido a que se está ejecutando en modo no seguro (puntero), la instrucción fija asigna un espacio de memoria específico a esa variable. Si no colocó la instrucción fija, el recolector de basura podría mover en la memoria la variable a cualquier lugar, cuando él quiera.

Espero esta ayuda.

MSDN tiene un ejemplo muy similar. La declaración fija básicamente bloquea la recolección de basura. En .Net, si utiliza un puntero a una ubicación de memoria, el tiempo de ejecución puede reasignar el objeto a un " mejor " Ubicación en cualquier momento. Si desea acceder directamente a la memoria, debe fijarla en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top