2008-09-30 8 views
12

Nous avons un code similaire à celui-ci dans l'un de nos projets. Quelqu'un peut-il expliquer (en anglais simple) pourquoi la déclaration fixe est nécessaire ici?Énoncé fixe en C#

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

Répondre

17

Il fixe le pointeur en mémoire. Les langues collectées par les ordures ont la liberté de déplacer les objets autour de la mémoire pour plus d'efficacité. Tout cela est transparent pour le programmeur car il n'utilise pas vraiment de pointeurs dans le code CLR "normal". Cependant, lorsque vous avez besoin de pointeurs, vous devez le réparer en mémoire si vous voulez travailler avec eux.

7

Vous en avez besoin partout où vous faites de l'arithmétique de pointeur, pour empêcher le ramasse-miettes de le déplacer sur vous.

+0

Je ne vois pas d'arithmétique de pointeur dans la question. peut-être pouvez-vous clarifier ce que vous entendez par «arithmétique». il n'y a pas de + - * ni /. –

+0

J'ai utilisé plus généralement le terme "arithmétique de pointeur" pour signifier "opérations effectuées sur un pointeur". –

9

Le fixed statement "épingle" la variable en mémoire afin que le garbage collector ne la déplace pas lors de la collecte. Si elle déplaçait la variable, le pointeur deviendrait inutile et lorsque vous l'utiliseriez, vous essayeriez d'accéder ou de modifier quelque chose que vous n'aviez pas prévu. Parce que vous exécutez en mode non sécurisé (pointeur), l'instruction fixe allouer un espace mémoire spécifique à cette variable

2

Si vous n'avez pas mis l'instruction fixe, le garbage collector pourrait déplacer la variable n'importe où, quand il le souhaite.

Espérons cette aide.

2

MSDN a un exemple très similaire. L'instruction fixe bloque essentiellement la récupération de place. Dans .Net si vous utilisez un pointeur vers un emplacement de mémoire, le runtime peut réaffecter l'objet à un "meilleur" emplacement à tout moment. Donc, si vous voulez accéder à la mémoire directement, vous devez le réparer.

Questions connexes