Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'istruzione fixed impedisce al Garbage Collector di spostare una variabile spostabile e dichiara un puntatore a tale variabile. L'indirizzo di una variabile fissa o aggiunta non cambia durante l'esecuzione dell'istruzione. È possibile usare il puntatore dichiarato solo all'interno dell'istruzione corrispondente fixed . Il puntatore dichiarato è di sola lettura e non può essere modificato:
unsafe
{
byte[] bytes = [1, 2, 3];
fixed (byte* pointerToFirst = bytes)
{
Console.WriteLine($"The address of the first array element: {(long)pointerToFirst:X}.");
Console.WriteLine($"The value of the first array element: {*pointerToFirst}.");
}
}
// Output is similar to:
// The address of the first array element: 2173F80B5C8.
// The value of the first array element: 1.
Annotazioni
È possibile usare l'istruzione fixed solo in un contesto non sicuro . Il codice che contiene blocchi non sicuri deve essere compilato con l'opzione del compilatore AllowUnsafeBlocks.
È possibile inizializzare il puntatore dichiarato come segue:
Con una matrice, come illustrato nell'esempio all'inizio di questo articolo. Il puntatore inizializzato contiene l'indirizzo del primo elemento della matrice.
Con un indirizzo di una variabile. Usare l'operatore address-of
&, come illustrato nell'esempio seguente:unsafe { int[] numbers = [10, 20, 30]; fixed (int* toFirst = &numbers[0], toLast = &numbers[^1]) { Console.WriteLine(toLast - toFirst); // output: 2 } }I campi oggetto sono un altro esempio di variabili spostabili che possono essere aggiunte.
Quando il puntatore inizializzato contiene l'indirizzo di un campo oggetto o di un elemento di matrice, l'istruzione
fixedgarantisce che il Garbage Collector non riloca o elimina l'istanza dell'oggetto contenitore durante l'esecuzione del corpo dell'istruzione.Con l'istanza del tipo che implementa un metodo denominato
GetPinnableReference. Tale metodo deve restituire unarefvariabile di un tipo non gestito. I tipi System.Span<T> .NET e System.ReadOnlySpan<T> usano questo modello. È possibile aggiungere istanze di span, come illustrato nell'esempio seguente:unsafe { int[] numbers = [10, 20, 30, 40, 50]; Span<int> interior = numbers.AsSpan()[1..^1]; fixed (int* p = interior) { for (int i = 0; i < interior.Length; i++) { Console.Write(p[i]); } // output: 203040 } }Per ulteriori informazioni, consultare il riferimento all'Span<T>.GetPinnableReference() API.
Con una stringa, come illustrato nell'esempio seguente:
unsafe { var message = "Hello!"; fixed (char* p = message) { Console.WriteLine(*p); // output: H } }Con un buffer a dimensione fissa.
È possibile allocare memoria nello stack, in cui non è soggetta a Garbage Collection e pertanto non è necessario aggiungerla. A tale scopo, usare un'espressionestackalloc .
È anche possibile usare la fixed parola chiave per dichiarare un buffer a dimensione fissa.
Specificazione del linguaggio C#
Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#: