Размер структуры - PullRequest
       4

Размер структуры

3 голосов
/ 22 января 2010

Можно получить размер структуры, используя


Marshal.SizeOf(typeof(mystruct));

Можно ли получить размер части структуры (например, я передаю функцию последнего поля структуры, и она возвращает сумму размеров предыдущих полей)? Как я понимаю возможно ли это с помощью отражения?

Ответы [ 3 ]

3 голосов
/ 22 января 2010
[StructLayout(LayoutKind.Explicit)]
public struct SomeStruct
{
    [FieldOffset(0)]
    public byte b1;
    [FieldOffset(3)]
    public byte b2;
    [FieldOffset(7)]
    public int i1;
    [FieldOffset(12)]
    public int i2;
}

class Program
{
    static FieldOffsetAttribute GetFieldOffset(string fieldName)
    {
        return (FieldOffsetAttribute)typeof(SomeStruct)
            .GetField(fieldName)
            .GetCustomAttributes(typeof(FieldOffsetAttribute), false)[0];
    }

    static void Main(string[] args)
    {
        var someStruct = new SomeStruct { b1 = 1, b2 = 2, i1 = 3, i2 = 4 };

        Console.WriteLine("field b1 offset: {0}", GetFieldOffset("b1").Value);
        Console.WriteLine("field b2 offset: {0}", GetFieldOffset("b2").Value);
        Console.WriteLine("field i1 offset: {0}", GetFieldOffset("i1").Value);
        Console.WriteLine("field i2 offset: {0}", GetFieldOffset("i2").Value);

        Console.ReadLine();
    }
}

Печать: смещение поля b1: 0 смещение поля b2: 3 смещение поля i1: 7 смещение поля i2: 12

2 голосов
/ 22 января 2010

Структура памяти структуры не может быть обнаружена в .NET. JIT-компилятор использует это преимущество, он переупорядочивает поля структуры, чтобы получить более эффективный макет. Это разрушает любую попытку использовать структуру таким образом, чтобы обойти обычные механизмы маршалинга. Да, Marshal.SiseOf () создает размер для структуры. Но этот размер действителен только после использования Marshal.StructureToPtr ().

Прямой ответ на ваш вопрос: нет, вы не можете определить размер, даже с помощью Reflection. По дизайну.

1 голос
/ 22 января 2010

Ну, я не уверен, но думаю, что это невозможно из-за возможных проблем с оптимизацией и выравниванием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...