结构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程序集,DateTime
和DateTimeOffset
是我在此布局中找到的唯一公开可见的结构。
有谁知道为什么DateTime
有这种不寻常的结构布局?
答案 0 :(得分:10)
这需要推测,这个决定是在很长时间之前完成的,早在.NET 1.0发布之前。 System.DateTime上的属性充其量只是一种微优化,在.NET代码中并不罕见。这有点合适,结构只有一个字段,所以布局从来没有任何问题。内部CustomAttribute结构的结构可能是由同一个程序员完成的。无关紧要,非托管代码永远不会看到它们。
System.DateTimeOffset的那个以后完成了,几乎可以肯定是一个复制粘贴错误。
程序员逃脱了它,没有理由让CLR重新安排顺序版本的布局。当struct在字段之间包含足够大以适合另一个小字段的填充时,会重新安排自动布局。不是DateTimeOffet的情况。
当您为DateTimeOffset提交反馈报告时,有些可能会让Microsoft大师注意这一点。这是错误的afaik。将其发布到connect.microsoft.com