固定サイズ バッファー (C# プログラミング ガイド)
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 に埋め込まれた配列を保持できるようになりました。次の例では、fixedBuffer 配列のサイズは固定です。配列の要素にアクセスするには、fixed ステートメントを使用して、最初の要素へのポインターを取得します。fixed ステートメントは、fixedBuffer のインスタンスをメモリ内の特定の場所に固定します。
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';
}
}
}
}
}
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 コンテキストの構造体のインスタンス フィールドのみに限られます。
参照
関連項目
unsafe コードとポインター (C# プログラミング ガイド)