Jak utworzyć unię C/C++ przy użyciu atrybutów w języku C#

Za pomocą atrybutów można dostosować sposób stosowania struktur w pamięci. Można na przykład utworzyć to, co jest znane jako unia w języku C/C++ przy użyciu StructLayout(LayoutKind.Explicit) atrybutów i FieldOffset .

W tym segmencie kodu wszystkie pola TestUnion rozpoczynające się w tej samej lokalizacji w pamięci.

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

Poniższy kod to kolejny przykład, w którym pola zaczynają się od różnych jawnie ustawionych lokalizacji.

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

Dwa pola i1 całkowite i i2 połączone współdzielą te same lokalizacje pamięci co lg. Używa lg pierwszych 8 bajtów lub i1 używa pierwszych 4 bajtów i i2 używa kolejnych 4 bajtów. Ten rodzaj kontroli nad układem struktury jest przydatny podczas korzystania z wywołania platformy.

Zobacz też