fixed statement – fäst en variabel för pekaråtgärder

-instruktionen fixed förhindrar att skräpinsamlaren flyttar en flyttbar variabel och deklarerar en pekare till variabeln. Adressen till en fast eller fäst variabel ändras inte under körningen av -instruktionen. Du kan endast använda den deklarerade pekaren i motsvarande fixed instruktion. Den deklarerade pekaren är skrivskyddad och kan inte ändras:

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.

Kommentar

Du kan endast använda -instruktionen fixed i en osäker kontext. Koden som innehåller osäkra block måste kompileras med kompileringsalternativet AllowUnsafeBlocks .

Du kan initiera den deklarerade pekaren på följande sätt:

  • Med en matris, som exemplet i början av den här artikeln visar. Den initierade pekaren innehåller adressen till det första matriselementet.

  • Med en adress för en variabel. Använd operatorns &adress, som följande exempel visar:

    unsafe
    {
        int[] numbers = [10, 20, 30];
        fixed (int* toFirst = &numbers[0], toLast = &numbers[^1])
        {
            Console.WriteLine(toLast - toFirst);  // output: 2
        }
    }
    

    Objektfält är ett annat exempel på flyttbara variabler som kan fästas.

    När den initierade pekaren innehåller adressen för ett objektfält eller ett matriselement garanterar instruktionen fixed att skräpinsamlaren inte flyttar eller tar bort den innehållande objektinstansen under körningen av instruktionstexten.

  • Med instansen av typen som implementerar en metod med namnet GetPinnableReference. Den metoden måste returnera en ref variabel av en ohanterad typ. .NET-typerna System.Span<T> och System.ReadOnlySpan<T> använd det här mönstret. Du kan fästa span-instanser, som följande exempel visar:

    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
        }
    }
    

    Mer information finns i API-referensen Span<T>.GetPinnableReference() .

  • Med en sträng, som följande exempel visar:

    unsafe
    {
        var message = "Hello!";
        fixed (char* p = message)
        {
            Console.WriteLine(*p);  // output: H
        }
    }
    
  • Med en buffert med fast storlek.

Du kan allokera minne på stacken, där den inte omfattas av skräpinsamling och därför inte behöver fästas. Om du vill göra det använder du ett stackalloc uttryck.

Du kan också använda nyckelordet fixed för att deklarera en buffert med fast storlek.

Språkspecifikation för C#

Mer information finns i följande avsnitt i C#-språkspecifikationen:

Se även