Puffer fester Größe (C#-Programmierhandbuch)

In C# können Sie die fixed-Anweisung verwenden, um einen Puffer mit einem Array fester Größe in einer Datenstruktur zu erstellen. Dies ist hilfreich, wenn Sie mit vorhandenem Code, z.B. Code in anderen Sprachen, bereits vorhandenen DLLs oder COM-Projekten arbeiten. Das Array fester Größe kann sämtliche Attribute und Modifizierer, die für reguläre Strukturmember zulässig sind, in Anspruch nehmen. Die einzige Einschränkung besteht darin, dass der Arraytyp bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float oder double sein muss.

private fixed char name[30];  

Hinweise

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. Stattdessen enthält die Struktur einen Verweis auf die Elemente.

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.

Vor C# 2.0 wäre das folgende struct z.B. 8 Bytes groß. Das pathName-Array ist ein Verweis auf das Heap zugeordnete Array:

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

Beginnend mit C# 2.0 kann ein struct ein eingebettetes Array enthalten. Im folgenden Beispiel verfügt das fixedBuffer-Array über eine feste Größe. Um auf die Elemente des Arrays zuzugreifen, verwenden Sie eine fixed-Anweisung, um einen Zeiger auf das erste Element festzulegen. Die fixed-Anweisung fixiert eine Instanz von fixedBuffer an einem bestimmten Speicherort im Arbeitsspeicher.

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. Char-Puffer mit fester Größe verwenden immer zwei Bytes pro Zeichen, unabhängig von der Codierung. Dies gilt auch, wenn Char-Puffer zu API-Methoden oder Strukturen mit CharSet = CharSet.Auto oder CharSet = CharSet.Ansi gemarshallt werden. Weitere Informationen finden Sie unter CharSet.

Ein anderes häufiges Array mit fester Größe ist das bool-Array. Die Elemente in einem bool-Array sind immer ein Byte groß. bool-Arrays eignen sich nicht zum Erstellen von Bitarrays oder Puffern.

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. Lassen Sie, wie bei jedem unsicheren Code, Vorsicht walten.

Unsichere Puffer unterscheiden sich folgendermaßen von normalen Arrays:

  • Sie können nur in einem unsicheren Kontext unsichere Puffer verwenden.

  • Unsichere Puffer sind immer Vektoren oder eindimensionale Arrays.

  • Die Deklaration des Arrays muss eine Anzahl enthalten, z.B. char id[8]. Sie können stattdessen nicht char id[] verwenden.

  • Unsichere Puffer können nur Instanzfelder von Strukturen in einem unsicheren Kontext sein.

Siehe auch

C#-Programmierhandbuch
Unsicherer Code und Zeiger
fixed-Anweisung
Interoperabilität