Gewusst wie: Erstellen einer Union in C/C++ mit Attributen (C#-Programmierhandbuch)

Aktualisiert: November 2007

Durch die Verwendung von Attributen können Sie das Layout von Strukturen im Speicher anpassen. Sie können beispielsweise ein in C/C++ als Union bezeichnetes Element erstellen, indem Sie das StructLayout(LayoutKind.Explicit)-Attribut und das FieldOffset-Attribut verwenden.

Beispiel

In diesem Codesegment beginnen alle Felder von TestUnion an derselben Speicherposition.

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

Im Folgenden sehen Sie ein Beispiel für Felder, die an anderen, explizit festgelegten Speicherpositionen starten.

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

Die beiden int-Felder i1 und i2 haben dieselbe Speicherposition wie lg. Diese Kontrolle über das Strukturlayout ist besonders bei Verwendung von Plattformaufrufen hilfreich.

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Reflektion (C#-Programmierhandbuch)

Attribute (C#-Programmierhandbuch)

Verwenden von Attributen (C#-Programmierhandbuch)

Auflösen der Mehrdeutigkeit von Attributzielen (C#-Programmierhandbuch)

Erstellen benutzerdefinierter Attribute (C#-Programmierhandbuch)

Zugriff auf Attribute mit Reflektion (C#-Programmierhandbuch)

System.Reflection

Attribute