Como criar uma união do C/C++ usando atributos em C#

Usando atributos, você pode personalizar como os structs são dispostos na memória. Por exemplo, você pode criar o que é conhecido como uma união no C/C++ usando os atributos StructLayout(LayoutKind.Explicit) e FieldOffset.

Neste segmento de código, todos os campos de TestUnion são iniciados no mesmo local na memória.

[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;
}

O código a seguir é outro exemplo em que os campos são iniciados em locais diferentes definidos explicitamente.

[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;
}

Os dois campos inteiros, i1 e i2 combinados, compartilham os mesmos locais de memória que lg. lg usa os primeiros oito bytes, ou então i1 usa os quatro primeiros bytes e i2 usa os próximos quatro bytes. Esse tipo de controle sobre o layout do struct é útil ao usar a invocação de plataforma.

Confira também