固定サイズ バッファ (C# プログラミング ガイド)
更新 : 2007 年 11 月
C# では、fixed ステートメントを使用して、データ構造内に固定サイズのバッファを作成できます。この機能は、別の言語で作成されたコード、既存の DLL プロジェクト、既存の COM プロジェクトなど、各種既存コードを操作するときに便利です。固定配列は、標準の構造体メンバのあらゆる属性または修飾子を使用できます。唯一の制限として、配列型を bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float、または double にする必要があります。
private fixed char name[30];
解説
C# の以前のバージョンでは、配列を格納する C# 構造体が配列要素を含まず、代わりに配列要素への参照を含むため、C++ スタイルの固定サイズの構造体を宣言するのが困難でした。
C# 2.0 では、安全でないコード ブロックでの使用時に固定サイズの配列を構造体に埋め込む機能が追加されています。
たとえば、C# 2.0 より前のバージョンでは、次の struct はサイズが 8 バイトで、pathName 配列はヒープ割り当て配列への参照です。
public struct MyArray
{
public char[] pathName;
private int reserved;
}
C# 2.0 では、struct は、埋め込まれた配列で次のように宣言できます。
public struct MyArray // This code must appear in an unsafe block
{
public fixed char pathName[128];
}
この構造体の pathName 配列は、サイズと位置が固定されるので、他のアンセーフ コードで使用できます。
128 要素の char 配列のサイズは 256 バイトです。固定サイズの char バッファは、エンコーディングとは無関係に、常に 1 文字につき 2 バイトを使用します。これは、CharSet = CharSet.Auto や CharSet = CharSet.Ansi によって char バッファが API メソッドや構造体にマーシャリングされる場合でも同じです。詳細については、「CharSet」を参照してください。
一般的な固定サイズの配列には、この他に bool 配列があります。bool 配列の要素は常にサイズが 1 バイトです。そのため、bool 配列は、ビット配列やバッファの作成には適していません。
メモ : |
---|
stackalloc を使用して作成されたメモリを除き、C# コンパイラおよび共通言語ランタイム (CLR: Common Language Runtime) は、バッファ オーバーランのセキュリティ チェックを実行しません。固定サイズの配列には、すべてのアンセーフ コードと同様に注意してください。 |
アンセーフ バッファは、通常の配列と次の点で異なります。
アンセーフ バッファは、unsafe コンテキストでのみ使用できます。
アンセーフ バッファは常にベクタ (1 次元配列) です。
配列の宣言には、char id[8] のように要素数を記述する必要があります。代わりに char id[] を使用することはできません。
アンセーフ バッファは、unsafe コンテキストの構造体のインスタンス フィールドのみに限られます。