Delen via


vaste instructie - een variabele vastmaken voor aanwijzerbewerkingen

Met fixed de instructie voorkomt u dat de garbagecollector een verplaatsbare variabele verplaatst en een aanwijzer naar die variabele declareert. Het adres van een vaste of vastgemaakte variabele verandert niet tijdens de uitvoering van de instructie. U kunt de gedeclareerde aanwijzer alleen in de bijbehorende fixed instructie gebruiken. De gedeclareerde aanwijzer is alleen-lezen en kan niet worden gewijzigd:

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.

Notitie

U kunt de fixed instructie alleen gebruiken in een onveilige context. De code die onveilige blokken bevat, moet worden gecompileerd met de optie AllowUnsafeBlocks Compiler.

U kunt de gedeclareerde aanwijzer als volgt initialiseren:

  • Met een matrix, zoals in het voorbeeld aan het begin van dit artikel wordt weergegeven. De geïnitialiseerde aanwijzer bevat het adres van het eerste matrixelement.

  • Met een adres van een variabele. Gebruik het adres van & de operator, zoals in het volgende voorbeeld wordt weergegeven:

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

    Objectvelden zijn een ander voorbeeld van verplaatsbare variabelen die kunnen worden vastgemaakt.

    Wanneer de geïnitialiseerde aanwijzer het adres van een objectveld of een matrixelement bevat, garandeert de fixed instructie dat de garbagecollector het betreffende objectexemplaar niet verplaatst of verwijdert tijdens de uitvoering van de hoofdtekst van de instructie.

  • Met het exemplaar van het type waarmee een methode met de naam GetPinnableReferencewordt geïmplementeerd. Deze methode moet een ref variabele van een niet-beheerd type retourneren. De .NET-typen System.Span<T> en System.ReadOnlySpan<T> maken gebruik van dit patroon. U kunt spaninstanties vastmaken, zoals in het volgende voorbeeld wordt weergegeven:

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

    Zie de Span<T>.GetPinnableReference() API-verwijzing voor meer informatie.

  • Met een tekenreeks, zoals in het volgende voorbeeld wordt weergegeven:

    unsafe
    {
        var message = "Hello!";
        fixed (char* p = message)
        {
            Console.WriteLine(*p);  // output: H
        }
    }
    
  • Met een buffer met vaste grootte.

U kunt geheugen toewijzen aan de stack, waar het niet onderhevig is aan garbagecollection en daarom niet hoeft te worden vastgemaakt. Gebruik hiervoor een stackalloc expressie.

U kunt ook het fixed trefwoord gebruiken om een buffer met een vaste grootte te declareren.

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie ook