Como criar uma União C/C++ usando atributos (C#)

Usando atributos, você pode personalizar a forma como as estruturas são colocadas 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.

Exemplos

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

// Add a using directive for System.Runtime.InteropServices.

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

A seguir, temos outro exemplo em que os campos são iniciados em locais diferentes definidos explicitamente.

// Add a using directive for System.Runtime.InteropServices.

[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, compartilham os mesmos locais de memória que lg. Esse tipo de controle sobre o layout do struct é útil ao usar a invocação de plataforma.

Confira também