Procedura: creare un'unione C/C++ mediante attributi (Guida per programmatori C#)

Aggiornamento: novembre 2007

Gli attributi consentono di personalizzare la modalità di disposizione delle struct nella memoria. È ad esempio possibile creare un'unione in C/C++ mediante gli attributi StructLayout(LayoutKind.Explicit) e FieldOffset.

Esempio

In questo segmento di codice tutti i campi di TestUnion iniziano nella stessa posizione di 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;
}

Nell'esempio riportato di seguito i campi iniziano in altre posizioni impostate in modo esplicito.

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

I due campi int, i1 e i2, condividono le stesse posizioni di memoria di lg. Questo tipo di controllo sul layout delle struct è utile quando ci si avvale delle chiamate a basso livello.

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Reflection (Guida per programmatori C#)

Attributi (Guida per programmatori C#)

Utilizzo di attributi (Guida per programmatori C#)

Risolvere le ambiguità sulle destinazioni degli attributi (Guida per programmatori C#)

Creazione di attributi personalizzati (Guida per programmatori C#)

Accesso agli attributi mediante reflection (Guida per programmatori C#)

System.Reflection

Attribute