.NET DateTime не имеет предопределенного размера - PullRequest
6 голосов
/ 24 июля 2011

Поскольку DateTime - это структура, члены которой, похоже, разбиваются на простые математические значения, я не уверен, почему использование sizeof () приводит к появлению сообщения в заголовке вопроса.

Ответы [ 3 ]

7 голосов
/ 24 июля 2011

Поскольку CLR может определять размер только во время выполнения ... одной из причин этого является "заполнение" (зависит от платформы) ...

Для всех других типов, включая структуры,Оператор sizeof может использоваться только в небезопасных кодовых блоках.Хотя вы можете использовать метод Marshal.SizeOf, значение, возвращаемое этим методом, не всегда совпадает со значением, возвращаемым sizeof.Marshal.SizeOf возвращает размер после того, как тип был маршалирован, тогда как sizeof возвращает размер , как он был назначен общеязыковой средой исполнения, включая любой отступ .

Ref .

см. Также Как проверить количество байтов, потребляемых структурой?

2 голосов
/ 19 февраля 2014

Полный текст ошибки, который вы получаете:

ошибка CS0233: «System.DateTime» не имеет предопределенного размера, поэтому sizeof может использоваться только в небезопасном контексте (рассмотрите возможность использования System.Runtime.InteropServices.Marshal.SizeOf)

Поэтому, если вы используете контекст unsafe (обязательно перейдите в «Свойства» проекта C #, вкладку «Построить» и установите флажокотметьте в «Разрешить небезопасный код», чтобы компилировать ниже), он работает нормально:

    static void Main()
    {
        int s;
        unsafe
        {
            s = sizeof(DateTime);
        }
        Console.WriteLine(s); // writes 8
    }

С ключевым словом unsafe, sizeof() будет работать со всеми типами enum и со всеми structтипы, у которых нет полей экземпляра ссылочного типа (и, конечно, DateTime - это структура без членов ссылочного типа).

Без ключевого слова unsafe нельзя использовать sizeof.(Однако, начиная с C # 2, вам разрешено использовать его на предопределенных типах, таких как int и enum, но не на других структурах, таких как DateTime, как вы видели.)


Обратите внимание, что структура DateTime является исключительной в том смысле, что Marshal.SizeOf<DateTime>() (или Marshal.SizeOf(typeof(DateTime)) до .NET версии 4.5.1 (2013)) вызовет исключение.Это из-за необычной (для struct) структуры компоновки «Авто».

0 голосов
/ 23 мая 2014

Алекс Пинскер написал хорошее решение для получения размера DateTime (или любого другого типа).

...