Практическое руководство. Создание объединения C/C++ с помощью атрибутов (руководство по программированию на C#)

Обновлен: Ноябрь 2007

Использование атрибутов позволяет настраивать расположение структур в памяти. Например, можно создать так называемое объединение в языках C/C++ с помощью атрибутов StructLayout(LayoutKind.Explicit) и FieldOffset.

Пример

В этом сегменте кода все поля объединения TestUnion начинаются с одного адреса в памяти.

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

Ниже приведен еще один пример, в котором поля начинаются с разных явно заданных адресов.

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

Два поля int, i1 и i2, совместно используют те же адреса в памяти, что и lg. Такое управление расположением структуры полезно при использовании вызова неуправляемого кода.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Отражение (Руководство по программированию на C#)

Атрибуты (Руководство по программированию на C#)

Использование атрибутов (Руководство по программированию на C#)

Устранение неоднозначностей в целевых объектах атрибутов (Руководство по программированию на C#)

Создание настраиваемых атрибутов (руководство по программированию в C#)

Доступ к атрибутам через отражение (Руководство по программированию в C#)

System.Reflection

Attribute