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

Jep*_*sen 14 .net c# datetime struct structlayout

结构System.DateTime及其表兄System.DateTimeOffset的结构布局类型设置为"自动".这可以看作:

typeof(DateTime).IsAutoLayout    /* true */
Run Code Online (Sandbox Code Playgroud)

要么:

typeof(DateTime).StructLayoutAttribute.Value    /* Auto */
Run Code Online (Sandbox Code Playgroud)

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

.class public auto ansi serializable sealed beforefieldinit System.DateTime
              ¯¯¯¯
Run Code Online (Sandbox Code Playgroud)

通常,使用C#编写的结构(即不是枚举的.NET值类型)将具有"顺序"布局(除非StructLayoutAttribute已应用指定另一个布局).

我通过一些常见的搜索BCL组件,以及DateTimeDateTimeOffset是唯一公开可见的结构,我发现用这个布局.

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

Han*_*ant 11

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

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

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

当你提交DateTimeOffset的反馈报告时,你会得到微软大师注意的一些可能性.这是错误的afaik.将其发布到connect.microsoft.com

  • 与DateTime不同,TimeSpan是[ComVisible(true)]. (5认同)
  • 你确定`DateTime`上的自动布局真的是无辜的,因为`DateTime`只有一个字段吗?我希望你能在另一个线程中阅读[我刚刚提交的答案](http://stackoverflow.com/a/21960547/1336654),其中单字段结构上的自动布局(类似于`DateTime`)似乎使用Sequential布局传播到"复合"结构的布局.如果您知道是否预期,也许您可​​以在那里发表评论. (2认同)