Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die fixed Anweisung verhindert, dass der Garbage Collector eine verschiebebare Variable neu angibt und einen Zeiger auf diese Variable deklariert. Die Adresse einer festen oder angehefteten Variablen ändert sich während der Ausführung der Anweisung nicht. 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:
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.
Hinweis
Sie können die fixed Anweisung nur in einem unsicheren Kontext verwenden. Der Code, der unsichere Blöcke enthält, muss mit der AllowUnsafeBlocks Compileroption kompiliert werden.
Sie können den deklarierten Zeiger wie folgt initialisieren:
Mit einem Array, wie das Beispiel am Anfang dieses Artikels zeigt. Der initialisierte Zeiger enthält die Adresse des ersten Arrayelements.
Mit einer Adresse einer Variablen. 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 verschiebebare Variablen, die angeheftet werden können.
Wenn der initialisierte Zeiger die Adresse eines Objektfelds oder eines Arrayelements enthält, garantiert die
fixedAnweisung, dass der Garbage Collector die enthaltende Objektinstanz während der Ausführung des Anweisungstexts nicht verlagern oder verwerfen kann.Mit der Instanz des Typs, der eine Methode namens
GetPinnableReferenceimplementiert. Diese Methode muss einerefVariable eines nicht verwalteten Typs zurückgeben. Die .NET-Typen System.Span<T> und System.ReadOnlySpan<T> verwenden dieses Muster. Sie können Instanzen überspannen, 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 Span<T>.GetPinnableReference() API-Referenz.
Mit einer Zeichenfolge, wie im folgenden Beispiel gezeigt:
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 zuordnen, wo sie nicht der Garbage Collection unterliegt und daher nicht angeheftet werden muss. Verwenden Sie dazu einen stackalloc Ausdruck.
Sie können auch das fixed Schlüsselwort verwenden, um einen Puffer mit fester Größe zu deklarieren.
C#-Sprachspezifikation
Weitere Informationen finden Sie in den folgenden Abschnitten der C#-Sprachspezifikation: