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

C# では、fixed ステートメントを使って、データの構造体に固定サイズの配列を持ったバッファーを作成することができます。In C#, you can use the fixed statement to create a buffer with a fixed size array in a data structure. 固定サイズのバッファーは、他の言語またはプラットフォームのデータ ソースと相互運用するメソッドを作成するときに便利です。Fixed size buffers are useful when you write methods that interop with data sources from other languages or platforms. この固定配列には、標準的な構造体メンバーで許容されている属性または修飾子であれば、何でも適用することができます。The fixed array can take any attributes or modifiers that are allowed for regular struct members. ただし配列の型は boolbytecharshortintlongsbyteushortuintulongfloatdouble のいずれかに該当する必要があり、それが唯一の制限となります。The only restriction is that the array type must be bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, or double.

private fixed char name[30];

コメントRemarks

セーフ コードでは、配列を含む C# 構造体に配列要素が含まれません。In safe code, a C# struct that contains an array does not contain the array elements. この場合、構造体には、配列の要素ではなく、その参照が格納されます。Instead, the struct contains a reference to the elements. unsafe のコード ブロックで使われている struct に、固定サイズの配列を埋め込むことができます。You can embed an array of fixed size in a struct when it is used in an unsafe code block.

次の struct のサイズは 8 バイトです。The following struct is 8 bytes in size. pathName 配列は参照です。The pathName array is a reference:

public struct PathArray
{
    public char[] pathName;
    private int reserved;
}

アンセーフ コードでは、struct に埋め込み配列を含めることができます。A struct can contain an embedded array in unsafe code. 以下の例の fixedBuffer 配列は固定サイズです。In the following example, the fixedBuffer array has a fixed size. fixed ステートメントを使用して、先頭要素へのポインターを確立します。You use a fixed statement to establish a pointer to the first element. このポインターを使用して配列の要素にアクセスします。You access the elements of the array through this pointer. fixed ステートメントによって、fixedBuffer インスタンス フィールドがメモリ内の特定の位置に固定されます。The fixed statement pins the fixedBuffer instance field to a specific location in memory.

internal unsafe struct MyBuffer
{
    public fixed char fixedBuffer[128];
}

internal unsafe class MyClass
{
    public MyBuffer myBuffer = default;
}

private static void AccessEmbeddedArray()
{
    MyClass myC = new MyClass();

    unsafe
    {
        // Pin the buffer to a fixed location in memory.
        fixed (char* charPtr = myC.myBuffer.fixedBuffer)
        {
            *charPtr = 'A';
        }
        // Access safely through the index:
        char c = myC.myBuffer.fixedBuffer[0];
        Console.WriteLine(c);
        // modify through the index:
        myC.myBuffer.fixedBuffer[0] = 'B';
        Console.WriteLine(myC.myBuffer.fixedBuffer[0]);
    }

}

要素数 128 の char 配列のサイズは 256 バイトです。The size of the 128 element char array is 256 bytes. 固定サイズの char 型バッファーは、エンコーディングに関係なく常に、1 文字あたり 2 バイトを消費します。Fixed size char buffers always take two bytes per character, regardless of the encoding. これは、char 型のバッファーが、CharSet = CharSet.Auto または CharSet = CharSet.Ansi で API メソッドや構造体にマーシャリングされたときにも当てはまります。This is true even when char buffers are marshaled to API methods or structs with CharSet = CharSet.Auto or CharSet = CharSet.Ansi. 詳細については、「CharSet」を参照してください。For more information, see CharSet.

上記の例は、固定せずに fixed フィールドにアクセスする方法を示しています。この方法は C# 7.3 以降から使用できます。The preceding example demonstrates accessing fixed fields without pinning, which is available starting with C# 7.3..

一般的な固定サイズの配列としては、他にも bool 配列があります。Another common fixed-size array is the bool array. bool 配列内の要素のサイズは常に 1 バイトです。The elements in a bool array are always one byte in size. bool 配列は、ビット配列やバッファーの作成には適していません。bool arrays are not appropriate for creating bit arrays or buffers.

注意

C# コンパイラおよび共通言語ランタイム (CLR) は、stackalloc を使って作成されたメモリを除き、バッファー オーバーランのセキュリティ チェックを実行しません。Except for memory created by using stackalloc, the C# compiler and the common language runtime (CLR) do not perform any security buffer overrun checks. その他のアンセーフ コードと同様、十分な注意が必要です。As with all unsafe code, use caution.

アンセーフ バッファーは、次の点で通常の配列とは異なります。Unsafe buffers differ from regular arrays in the following ways:

  • アンセーフ バッファーの使用は、unsafe コンテキストに限られます。You can only use unsafe buffers in an unsafe context.
  • アンセーフ バッファーは常にベクタ (1 次元配列) です。Unsafe buffers are always vectors, or one-dimensional arrays.
  • 配列の宣言には要素数を指定する必要があります (例: char id[8])。The declaration of the array should include a count, such as char id[8]. char id[] は使用できません。You cannot use char id[].
  • アンセーフ バッファーは、unsafe コンテキストで構造体のインスタンス フィールドとしてのみ使用できます。Unsafe buffers can only be instance fields of structs in an unsafe context.

参照See Also

C# プログラミング ガイドC# Programming Guide
アンセーフ コードとポインターUnsafe Code and Pointers
fixed ステートメントfixed Statement
相互運用性Interoperability