Почему структура 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, которая не является перечислением), написанная на С#, будет иметь макет "Последовательный" (если только StructLayoutAttribute не имеет был применен для указания другого макета).

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

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

Ответ 1

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

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

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

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