16

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

typeof(DateTime).IsAutoLayout    /* true */

或者:

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

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

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

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

我搜索了一些常见的BCL程序集,DateTime并且DateTimeOffset是我在此布局中发现的唯一公开可见的结构。

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

4

1 回答 1

14

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

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

那个程序员侥幸逃脱,CLR 没有理由从顺序版本重新安排布局。当结构包含足够大以容纳另一个小字段的字段之间的填充时,会使用自动布局进行重新排列。DateTimeOffet 不是这种情况。

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

于 2014-02-19T14:27:41.057 回答