方法 : 属性を使用して C/C++ の共用体を作成する (C# プログラミング ガイド)
更新 : 2007 年 11 月
属性を使用すると、構造体のメモリ内での配置をカスタマイズできます。たとえば、StructLayout(LayoutKind.Explicit) 属性と FieldOffset 属性を使用すると、C/C++ の共用体と呼ばれるものを作成できます。
使用例
このコード セグメントでは、TestUnion のすべてのフィールドがメモリ内の同じ場所で開始されます。
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[System.Runtime.InteropServices.FieldOffset(0)]
public int i;
[System.Runtime.InteropServices.FieldOffset(0)]
public double d;
[System.Runtime.InteropServices.FieldOffset(0)]
public char c;
[System.Runtime.InteropServices.FieldOffset(0)]
public byte b;
}
フィールドが別の明示的に設定された場所で開始されるもう 1 つの例を次に示します。
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
[System.Runtime.InteropServices.FieldOffset(0)]
public long lg;
[System.Runtime.InteropServices.FieldOffset(0)]
public int i1;
[System.Runtime.InteropServices.FieldOffset(4)]
public int i2;
[System.Runtime.InteropServices.FieldOffset(8)]
public double d;
[System.Runtime.InteropServices.FieldOffset(12)]
public char c;
[System.Runtime.InteropServices.FieldOffset(14)]
public byte b;
}
2 つの int フィールドの i1 と i2 は、lg と同じメモリ位置を共有します。このような構造体レイアウトの制御は、プラットフォーム呼び出しのときに便利です。