Freigeben über


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

In C# können Sie mit der fixed-Anweisung einen Puffer mit einem Array fester Größe in einer Datenstruktur erstellen. Dies bietet sich an, wenn Sie mit vorhandenem Code wie Code aus anderen Programmiersprachen, vorhandenen DLLs oder COM-Projekten arbeiten. Das Array fester Größe kann sämtliche Attribute und Modifizierer verwenden, die für reguläre Strukturmember zulässig sind. Die einzige Einschränkung ist die, dass das Array vom Typ 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 es schwierig, eine Struktur im C++-Stil mit fester Größe zu deklarieren, da eine C#-Struktur, die ein Array enthält, die Arrayelemente nicht enthält. Stattdessen enthält die Struktur einen Verweis auf die Elemente.

In C# 2.0 kann ein Array fester Größe in eine Struktur eingebettet werden, wenn diese in einem unsafe-Codeblock verwendet wird.

Zum Beispiel wäre vor C# 2.0 die folgende struct 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 struct einen eingebetteten Array enthalten. Im folgenden Beispiel hat der fixedBuffer-Array eine feste Größe. Um auf die Elemente des Arrays zuzugreifen, legen Sie mit einer fixed-Anweisung einen Zeiger auf das erste Element fest. Die fixed-Anweisung fixiert eine Instanz von fixedBuffer an einer bestimmten Position 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 Elemente umfassenden char-Arrays beträgt 256 Bytes. char-Puffer fester Größe beanspruchen ungeachtet der Codierung immer zwei Bytes pro Zeichen. Dies gilt selbst dann, wenn char-Puffer mit CharSet = CharSet.Auto oder CharSet = CharSet.Ansi zu API-Methoden oder Strukturen gemarshallt werden. Weitere Informationen finden Sie unter CharSet.

Ein weiteres häufig verwendetes Array fester Größe ist das bool-Array. Die Elemente in einem bool-Array sind immer ein Byte groß. bool-Arrays sind nicht geeignet für das Erstellen von Bitarrays oder Puffern.

Hinweis

Außer bei mit stackalloc generiertem Speicher führen der C#-Compiler und die Common Language Runtime (CLR) keine Sicherheitsprüfungen zum Pufferüberlauf durch.Wie bei jedem unsicheren Code ist auch hier Vorsicht geboten.

Nicht sichere Puffer unterscheiden sich wie folgt von regulären Arrays:

  • Sie können nicht sichere Puffer nur in einem nicht sicheren Kontext verwenden.

  • Nicht sichere Puffer sind immer Vektoren oder eindimensionale Arrays.

  • Die Deklaration des Arrays muss eine Anzahl enthalten, z. B. char id[8]. char id[] dagegen ist nicht zulässig.

  • Nicht sichere Puffer können nur Instanzfelder von Strukturen in einem nicht sicheren Kontext sein.

Siehe auch

Referenz

Unsicherer Code und Zeiger (C#-Programmierhandbuch)

fixed-Anweisung (C#-Referenz)

Interoperabilität (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch