Почему структура System.DateTime имеет макет типа Auto?

Структура System.DateTime и его двоюродный брат System.DateTimeOffset их тип структуры размещения установлен на "Авто". Это можно увидеть с помощью:

typeof(DateTime).IsAutoLayout    /* true */

или же:

typeof(DateTime).StructLayoutAttribute.Value    /* Auto */

или это видно из IL, который заявляет:

.class public auto ansi serializable sealed beforefieldinit System.DateTime
              ¯¯¯¯

Обычно структура (то есть тип значения.NET, который не является перечислением), написанный на C#, будет иметь макет "Последовательный" (если только StructLayoutAttribute был применен для указания другого макета).

Я искал некоторые общие сборки BCL, и DateTime а также DateTimeOffset были единственными публично видимыми структурами, которые я нашел с этим макетом.

Кто-нибудь знает почему DateTime имеет эту необычную структуру структуры?

1 ответ

Решение

Это потребует спекуляций, это решение было принято давно, задолго до выпуска.NET 1.0. Атрибут System.DateTime в лучшем случае является микрооптимизацией, что не редкость в.NET-коде. Это несколько уместно, структура имеет только одно поле, поэтому с макетом проблем не возникает. Те для внутренних структур CustomAttribute, вероятно, были сделаны одним и тем же программистом. Не имеет значения, неуправляемый код никогда не видит их.

Один для System.DateTimeOffset был сделан намного позже и почти наверняка ошибка копирования-вставки.

Этому программисту это сошло с рук, и у CLR нет причин перестраивать компоновку из последовательной версии. Переупорядочение с автоматическим размещением происходит, когда структура содержит отступы между полями, которые являются достаточно большими, чтобы соответствовать другому небольшому полю. Не тот случай для DateTimeOffet.

Некоторые шансы, что вы заставите гуру Microsoft обратить на это внимание при подаче отчета об отзыве для DateTimeOffset. Это неправильно, афаик. Разместите его на connect.microsoft.com

Другие вопросы по тегам