固定サイズ バッファー (C# プログラミング ガイド)

C# では、fixed ステートメントを使って、データの構造体に固定サイズの配列を持ったバッファーを作成することができます。 これは既存のコード (他の言語で記述されたコード、既存の DLL、COM プロジェクトなど) を扱う場面で役立ちます。 この固定配列には、標準的な構造体メンバーで許容されている属性または修飾子であれば、何でも適用することができます。 ただし配列の型は boolbytecharshortintlongsbyteushortuintulongfloatdouble のいずれかに該当する必要があり、それが唯一の制限となります。

private fixed char name[30];  

コメント

以前のバージョンの C# では、C++ スタイルの固定サイズ構造体を宣言することが困難でした。配列を含んだ C# の構造体には、配列の要素は格納されないためです。 この場合、構造体には、配列の要素ではなく、その参照が格納されます。

C# 2.0 では、unsafe のコード ブロックで使われている struct に、固定サイズの配列を埋め込むことができるようになりました。

たとえば 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 バイトを消費します。 これは、char 型のバッファーが、CharSet = CharSet.Auto または CharSet = CharSet.Ansi で API メソッドや構造体にマーシャリングされたときにも当てはまります。 詳細については、「CharSet」を参照してください。

一般的な固定サイズの配列としては、他にも bool 配列があります。 bool 配列内の要素のサイズは常に 1 バイトです。 bool 配列は、ビット配列やバッファーの作成には適していません。

注意

C# コンパイラおよび共通言語ランタイム (CLR) は、stackalloc を使って作成されたメモリを除き、バッファー オーバーランのセキュリティ チェックを実行しません。 その他のアンセーフ コードと同様、十分な注意が必要です。

アンセーフ バッファーは、次の点で通常の配列とは異なります。

  • アンセーフ バッファーの使用は、unsafe コンテキストに限られます。

  • アンセーフ バッファーは常にベクタ (1 次元配列) です。

  • 配列の宣言には要素数を指定する必要があります (例: char id[8])。 char id[] のようにすることはできません。

  • アンセーフ バッファーは、unsafe コンテキストで構造体のインスタンス フィールドとしてのみ使用できます。

関連項目

C# プログラミング ガイド
アンセーフ コードとポインター
fixed ステートメント
相互運用性