Fixed-Anweisung (C#-Referenz)

Die fixed Anweisung verhindert, dass der Garbage Collector eine wechselbare Variable neu verschieben und einen Zeiger auf diese Variable deklariert:

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.

Die Adresse einer festen oder angehefteten Variable ändert sich nicht für die Dauer der Anweisung. Sie können den deklarierten Zeiger nur innerhalb der entsprechenden fixed Anweisung verwenden. Der deklarierte Zeiger ist schreibgeschützt und kann nicht geändert werden.

Hinweis

Sie können die Anweisung nur in einem unsicherenfixed Kontext verwenden. Code, in dem unsichere Blöcke enthalten sind, muss mit der Compileroption AllowUnsafeBlocks kompiliert werden.

Sie können den deklarierten Zeiger wie folgt initialisieren:

  • Mit einem Array, wie das Beispiel am Anfang dieses Artikels dargestellt wird. Der initialisierte Zeiger enthält die Adresse des ersten Arrayelements.

  • Mit einer Adresse einer Variable. Verwenden Sie die Adresse des & Operators, wie das folgende Beispiel zeigt:

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

    Objektfelder sind ein weiteres Beispiel für wechselbare Variablen, die angeheftet werden können.

    Wenn der initialisierte Zeiger die Adresse eines Objektfelds oder eines Arrayelements enthält, garantiert die fixed Anweisung, dass der Garbage Collector die enthaltende Objektinstanz während der Ausführung des Anweisungstexts nicht verschoben oder entsorgt.

  • Mit der Instanz des Typs, der eine Methode namens implementiert GetPinnableReference. Diese Methode muss eine ref Variable eines nicht verwalteten Typs zurückgeben. Die .NET-Typen System.Span<T> und System.ReadOnlySpan<T> verwenden dieses Muster. Sie können Instanzen anheften, wie im folgenden Beispiel gezeigt:

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

    Weitere Informationen finden Sie in der Referenz für die Span<T>.GetPinnableReference()-API.

  • Mit einer Zeichenfolge, wie das folgende Beispiel zeigt:

    unsafe
    {
        var message = "Hello!";
        fixed (char* p = message)
        {
            Console.WriteLine(*p);  // output: H
        }
    }
    
  • Mit einem Puffer mit fester Größe.

Sie können Speicher auf dem Stapel zuweisen, wo sie nicht der Garbage Collection unterliegen und daher nicht angeheftet werden müssen. Hierzu verwenden Sie einen stackalloc-Ausdruck.

Sie können auch das fixed Schlüsselwort verwenden, um einen festen Puffer zu deklarieren.

C#-Sprachspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation:

Informationen zur musterbasierten fixedfixed Anweisung finden Sie in der Featurenotiz "Musterbasierte Anweisung".

Weitere Informationen