为什么System.DateTime结构具有布局类型Auto?

时间:2014-02-19 13:13:10

标签: c# .net datetime struct structlayout

结构System.DateTime及其表兄System.DateTimeOffset的结构布局类型设置为“自动”。这可以通过以下方式看出:

typeof(DateTime).IsAutoLayout    /* true */

或:

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

或者从IL中可以看出它声明:

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

通常,使用C#编写的struct(不是枚举的.NET值类型)将具有“Sequential”布局(除非已应用StructLayoutAttribute指定另一个布局)。

我搜索了一些常见的BCL程序集,DateTimeDateTimeOffset是我在此布局中找到的唯一公开可见的结构。

有谁知道为什么DateTime有这种不寻常的结构布局?

1 个答案:

答案 0 :(得分:10)

这需要推测,这个决定是在很长时间之前完成的,早在.NET 1.0发布之前。 System.DateTime上的属性充其量只是一种微优化,在.NET代码中并不罕见。这有点合适,结构只有一个字段,所以布局从来没有任何问题。内部CustomAttribute结构的结构可能是由同一个程序员完成的。无关紧要,非托管代码永远不会看到它们。

System.DateTimeOffset的那个以后完成了,几乎可以肯定是一个复制粘贴错误。

程序员逃脱了它,没有理由让CLR重新安排顺序版本的布局。当struct在字段之间包含足够大以适合另一个小字段的填充时,会重新安排自动布局。不是DateTimeOffet的情况。

当您为DateTimeOffset提交反馈报告时,有些可能会让Microsoft大师注意这一点。这是错误的afaik。将其发布到connect.microsoft.com