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. Dies ist hilfreich, wenn Sie mit vorhandenem Code, z.B. Code in anderen Sprachen, bereits vorhandenen DLLs oder COM-Projekten arbeiten.This is useful when you are working with existing code, such as code written in other languages, pre-existing DLLs or COM projects. 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

In frühen Versionen von C# war das Deklarieren einer C++-Struktur mit fester Größe schwierig, da eine C#-Struktur, die ein Array enthält, keine Elemente des Arrays enthält.In early versions of C#, declaring a C++ style fixed-size structure was difficult because 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.

C# 2.0 hat die Möglichkeit hinzugefügt, ein Array fester Größe in ein struct einzubetten, wenn es in einem unsafe-Codeblock verwendet wird.C# 2.0 added the ability to embed an array of fixed size in a struct when it is used in an unsafe code block.

Vor C# 2.0 wäre das folgende struct z.B. 8 Bytes groß.For example, before C# 2.0, the following struct would be 8 bytes in size. Das pathName-Array ist ein Verweis auf das Heap zugeordnete Array:The pathName array is a reference to the heap-allocated array:

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

Beginnend mit C# 2.0 kann ein struct ein eingebettetes Array enthalten.Beginning with C# 2.0, a struct can contain an embedded array. Im folgenden Beispiel verfügt das fixedBuffer-Array über eine feste Größe.In the following example, the fixedBuffer array has a fixed size. Um auf die Elemente des Arrays zuzugreifen, verwenden Sie eine fixed-Anweisung, um einen Zeiger auf das erste Element festzulegen.To access the elements of the array, you use a fixed statement to establish a pointer to the first element. Die fixed-Anweisung fixiert eine Instanz von fixedBuffer an einem bestimmten Speicherort im Arbeitsspeicher.The fixed statement pins an instance of fixedBuffer to a specific location in memory.

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

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

    internal class Program
    {
        static void Main()
        {
            MyClass myC = new MyClass();

            unsafe
            {
                // Pin the buffer to a fixed location in memory.
                fixed (char* charPtr = myC.myBuffer.fixedBuffer)
                {
                    *charPtr = 'A';
                }
            }
        }
    }
}

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.

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 stattdessen nicht char id[] verwenden.You cannot use char id[] instead.

  • 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