2008-09-30 11 views
12

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

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

Respuesta

17

Arregla el puntero en la memoria. Los lenguajes recolectados 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 el código CLR "normal". Sin embargo, cuando requiera punteros, debe corregirlos en la memoria si desea trabajar con ellos.

7

Lo necesita en cualquier lugar donde haga aritmética de puntero, para evitar que el recolector de basura lo mueva.

+0

No veo ninguna operación aritmética de puntero en la pregunta. quizás puedas aclarar a qué te refieres con 'aritmética'. no hay + - * ni /. –

+0

Utilicé el término "aritmética del puntero" de manera más amplia, para indicar "operaciones realizadas en un puntero". –

9

El fixed statement "fijará" la variable en la memoria para que el recolector de basura no la mueva durante la recolección. Si moviera la variable, el puntero se volvería inútil y cuando lo usabas intentaría acceder o modificar algo que no pretendías.

2

Dado que se está ejecutando en modo inseguro (puntero), la instrucción fija asigna un espacio de memoria específico a esa variable. Si no puso la instrucción fija, el recolector de basura podría mover en la memoria la variable a cualquier lugar, cuando lo desee.

Espero que esta ayuda.

2

MSDN tiene un ejemplo muy similar. La instrucció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 una ubicación "mejor" en cualquier momento. ASÍ QUE, si desea acceder a la memoria directamente, debe arreglarla en su lugar.