Domanda

In uno dei nostri progetti abbiamo un codice simile al seguente. Qualcuno può spiegare (in inglese semplice) perché qui è necessaria la dichiarazione fissa?

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

Soluzione

Corregge il puntatore in memoria. I linguaggi della spazzatura raccolti hanno la libertà di spostare gli oggetti nella memoria per maggiore efficienza. Tutto ciò è trasparente per il programmatore perché in realtà non usano i puntatori in " normale " Codice CLR. Tuttavia, quando hai bisogno di puntatori, devi ripararlo in memoria se vuoi lavorare con loro.

Altri suggerimenti

La istruzione fissa sarà " pin " ; la variabile in memoria in modo che il Garbage Collector non la sposti durante la raccolta. Se spostasse la variabile, il puntatore diventerebbe inutile e quando l'avresti usato avresti tentato di accedere o modificare qualcosa che non avevi intenzione di fare.

Ne hai bisogno ovunque esegui l'aritmetica del puntatore, per impedire al garbage collector di spostarlo su di te.

Poiché si esegue in modalità non sicura (puntatore), l'istruzione fissa alloca uno spazio di memoria specifico a quella variabile. Se non hai inserito l'istruzione fissa, il garbage collector potrebbe spostare in memoria la variabile ovunque, quando vuole.

Spero che questo aiuto.

MSDN ha un esempio molto simile. L'istruzione fissa sostanzialmente blocca la garbage collection. In .Net se si utilizza un puntatore a una posizione di memoria, il runtime può riallocare l'oggetto in un "migliore" posizione in qualsiasi momento. Quindi, se si desidera accedere direttamente alla memoria, è necessario ripararla in posizione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top