Cómo: Crear una unión de C/C++ mediante atributos (Guía de programación de C#)

Actualización: noviembre 2007

Mediante los atributos, es posible personalizar cómo se organizan las estructuras en la memoria. Por ejemplo, se puede crear lo que se conoce en C/C++ como unión mediante los atributos StructLayout(LayoutKind.Explicit) y FieldOffset.

Ejemplo

En este segmento de código, todos los campos de TestUnion comienzan en la misma ubicación de la memoria.

[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 continuación se da otro ejemplo donde los campos comienzan en diferentes ubicaciones establecidas de manera explícita.

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

Los dos campos int, i1 e i2, comparten las mismas posiciones de memoria que lg. Esta clase de control sobre la organización de una estructura es útil cuando se utilizan llamadas de la plataforma.

Vea también

Conceptos

Guía de programación de C#

Referencia

Reflexión (Guía de programación de C#)

Atributos (Guía de programación de C#)

Utilizar atributos (Guía de programación de C#)

Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)

Crear atributos personalizados (Guía de programación de C#)

Acceso a atributos mediante reflexión (Guía de programación de C#)

System.Reflection

Attribute