Puffer fester Größe (C#-Programmierhandbuch)Fixed Size Buffers (C# Programming Guide)

In C# können Sie die fixed-Anweisung verwenden, um einen Puffer mit einem Array fester Größe in einer Datenstruktur zu erstellen.In C#, you can use the fixed statement to create a buffer with a fixed size array in a data structure. Puffer mit fester Größe sind nützlich, wenn Sie Methoden schreiben, die mit Datenquellen aus anderen Sprachen oder Plattformen zusammenarbeiten.Fixed size buffers are useful when you write methods that interop with data sources from other languages or platforms. Das Array fester Größe kann sämtliche Attribute und Modifizierer, die für reguläre Strukturmember zulässig sind, in Anspruch nehmen.The fixed array can take any attributes or modifiers that are allowed for regular struct members. Die einzige Einschränkung besteht darin, dass der Arraytyp bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float oder double sein muss.The only restriction is that the array type must be bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, or double.

private fixed char name[30];

HinweiseRemarks

Eine C#-Struktur in sicherem Code, die ein Array enthält, enthält nicht die Elemente des Arrays.In safe code, a C# struct that contains an array does not contain the array elements. Stattdessen enthält die Struktur einen Verweis auf die Elemente.Instead, the struct contains a reference to the elements. Sie können ein Array mit einer festen Größe in eine Struktur einbetten, wenn es in einem unsicheren Codeblock verwendet wird.You can embed an array of fixed size in a struct when it is used in an unsafe code block.

Das folgende struct ist 8 Byte groß.The following struct is 8 bytes in size. Das pathName-Array ist ein Verweis:The pathName array is a reference:

public struct PathArray
{
    public char[] pathName;
    private int reserved;
}

Ein struct kann ein eingebettetes Array in unsicheren Code enthalten.A struct can contain an embedded array in unsafe code. Im folgenden Beispiel verfügt das fixedBuffer-Array über eine feste Größe.In the following example, the fixedBuffer array has a fixed size. Sie können eine fixed-Anweisung verwenden, um einen Zeiger auf das erste Element festzulegen.You use a fixed statement to establish a pointer to the first element. Über diesen Zeiger können Sie auf die Elemente des Arrays zugreifen.You access the elements of the array through this pointer. Die fixed-Anweisung fixiert das Instanzenfeld fixedBuffer an einem bestimmten Speicherort im Arbeitsspeicher.The fixed statement pins the fixedBuffer instance field to a specific location in memory.

internal unsafe struct MyBuffer
{
    public fixed char fixedBuffer[128];
}

internal unsafe class MyClass
{
    public MyBuffer myBuffer = default;
}

private static void AccessEmbeddedArray()
{
    MyClass myC = new MyClass();

    unsafe
    {
        // Pin the buffer to a fixed location in memory.
        fixed (char* charPtr = myC.myBuffer.fixedBuffer)
        {
            *charPtr = 'A';
        }
        // Access safely through the index:
        char c = myC.myBuffer.fixedBuffer[0];
        Console.WriteLine(c);
        // modify through the index:
        myC.myBuffer.fixedBuffer[0] = 'B';
        Console.WriteLine(myC.myBuffer.fixedBuffer[0]);
    }

}

Die Größe des 128-Element-char-Arrays beträgt 256 Bytes.The size of the 128 element char array is 256 bytes. Char-Puffer mit fester Größe verwenden immer zwei Bytes pro Zeichen, unabhängig von der Codierung.Fixed size char buffers always take two bytes per character, regardless of the encoding. Dies gilt auch, wenn Char-Puffer zu API-Methoden oder Strukturen mit CharSet = CharSet.Auto oder CharSet = CharSet.Ansi gemarshallt werden.This is true even when char buffers are marshaled to API methods or structs with CharSet = CharSet.Auto or CharSet = CharSet.Ansi. Weitere Informationen finden Sie unter CharSet.For more information, see CharSet.

Im obigen Beispiel wird der Zugriff auf fixed-Felder ohne Anheften dargestellt, was ab C# 7.3 verfügbar ist.The preceding example demonstrates accessing fixed fields without pinning, which is available starting with C# 7.3..

Ein anderes häufiges Array mit fester Größe ist das bool-Array.Another common fixed-size array is the bool array. Die Elemente in einem bool-Array sind immer ein Byte groß.The elements in a bool array are always one byte in size. bool-Arrays eignen sich nicht zum Erstellen von Bitarrays oder Puffern.bool arrays are not appropriate for creating bit arrays or buffers.

Hinweis

Mit Ausnahme von Arbeitsspeicher, der mithilfe von stackalloc erstellt wurde, führen der C#-Compiler und die Common Language Runtime (CLR) keine Sicherheitsüberprüfungen für Pufferüberlauf aus.Except for memory created by using stackalloc, the C# compiler and the common language runtime (CLR) do not perform any security buffer overrun checks. Lassen Sie, wie bei jedem unsicheren Code, Vorsicht walten.As with all unsafe code, use caution.

Unsichere Puffer unterscheiden sich folgendermaßen von normalen Arrays:Unsafe buffers differ from regular arrays in the following ways:

  • Sie können nur in einem unsicheren Kontext unsichere Puffer verwenden.You can only use unsafe buffers in an unsafe context.
  • Unsichere Puffer sind immer Vektoren oder eindimensionale Arrays.Unsafe buffers are always vectors, or one-dimensional arrays.
  • Die Deklaration des Arrays muss eine Anzahl enthalten, z.B. char id[8].The declaration of the array should include a count, such as char id[8]. Sie können char id[] nicht verwenden.You cannot use char id[].
  • Unsichere Puffer können nur Instanzfelder von Strukturen in einem unsicheren Kontext sein.Unsafe buffers can only be instance fields of structs in an unsafe context.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Unsicherer Code und ZeigerUnsafe Code and Pointers
fixed-Anweisungfixed Statement
InteroperabilitätInteroperability