Puffer fester Größe (C#-Programmierhandbuch)
Aktualisiert: November 2007
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üheren 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, nur Verweise auf die Arrayelemente, nicht aber die Elemente selbst enthält.
In C# 2.0 kann ein Array fester Größe in eine Struktur eingebettet werden, wenn diese in einem unsafe-Codeblock verwendet wird.
Vor C# 2.0 war folgende struct z. B. 8 Bytes groß, wobei das pathName-Array einem Verweis auf das dem Heap zugeordnete Array entspricht:
public struct MyArray
{
public char[] pathName;
private int reserved;
}
In C# 2.0 kann eine struct mit einem eingebetteten Array deklariert werden:
public struct MyArray // This code must appear in an unsafe block
{
public fixed char pathName[128];
}
In dieser Struktur hat das pathName-Array eine feste Größe und Adresse und kann deshalb mit anderem unsicheren Code verwendet werden.
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 eines bool-Arrays sind immer ein Byte groß. bool-Arrays eignen sich nicht zum 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.