Erstellen einer Union in C/C++ mithilfe von Attributen in C#

Mithilfe von Attributen können Sie anpassen, wie Strukturen im Arbeitsspeicher angeordnet werden. Sie können z.B. das erstellen, was als eine Union in C/C++ bekannt ist, indem Sie die mit StructLayout(LayoutKind.Explicit)- und FieldOffset-Attribute verwenden.

In diesem Codesegment beginnen alle Felder von TestUnion an derselben Position im Arbeitsspeicher.

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

Der folgende Code ist ein weiteres Beispiel dafür, wie Felder an verschiedenen, explizit festgelegten Orten beginnen.

[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 zwei Ganzzahlfelder, i1 und i2 kombiniert, haben die gleichen Speicheradressen wie lg. Entweder lg verwendet die ersten 8 Bytes oder i1 die ersten 4 Bytes und i2 die nächsten 4 Bytes. Diese Art der Kontrolle über das Strukturlayout ist nützlich, wenn Sie Plattformaufrufe nutzen.

Siehe auch