固定サイズ バッファー (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. これは既存のコード (他の言語で記述されたコード、既存の DLL、COM プロジェクトなど) を扱う場面で役立ちます。This is useful when you are working with existing code, such as code written in other languages, pre-existing DLLs or COM projects. この固定配列には、標準的な構造体メンバーで許容されている属性または修飾子であれば、何でも適用することができます。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# では、C++ スタイルの固定サイズ構造体を宣言することが困難でした。配列を含んだ C# の構造体には、配列の要素は格納されないためです。In early versions of C#, declaring a C++ style fixed-size structure was difficult because a C# struct that contains an array does not contain the array elements. この場合、構造体には、配列の要素ではなく、その参照が格納されます。Instead, the struct contains a reference to the elements.

C# 2.0 では、unsafe のコード ブロックで使われている struct に、固定サイズの配列を埋め込むことができるようになりました。C# 2.0 added the ability to embed an array of fixed size in a struct when it is used in an unsafe code block.

たとえば C# 2.0 未満では、以下の struct のサイズは 8 バイトとなります。For example, before C# 2.0, the following struct would be 8 bytes in size. pathName 配列は、ヒープに割り当てられた配列の参照です。The pathName array is a reference to the heap-allocated array:

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

C# 2.0 以降では、struct が埋め込み配列を保持できるようになりました。Beginning with C# 2.0, a struct can contain an embedded array. 以下の例の fixedBuffer 配列は固定サイズです。In the following example, the fixedBuffer array has a fixed size. 配列の要素にアクセスするには、fixed ステートメントを使用して先頭要素へのポインターを確立します。To access the elements of the array, you use a fixed statement to establish a pointer to the first element. fixed ステートメントによって、fixedBuffer のインスタンスがメモリ内の特定の位置に固定されます。The fixed statement pins an instance of fixedBuffer to a specific location in memory.

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 バイトです。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.

一般的な固定サイズの配列としては、他にも 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[] instead.

  • アンセーフ バッファーは、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