次の方法で共有


方法 : 属性を使用して 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 と同じメモリ位置を共有します。このような構造体レイアウトの制御は、プラットフォーム呼び出しのときに便利です。

参照

概念

C# プログラミング ガイド

参照

リフレクション (C# プログラミング ガイド)

属性 (C# プログラミング ガイド)

属性の使用 (C# プログラミング ガイド)

属性の対象の明確化 (C# プログラミング ガイド)

カスタム属性の作成 (C# プログラミング ガイド)

リフレクションによる属性へのアクセス (C# プログラミング ガイド)

System.Reflection

Attribute