struct
System.DateTime
及其表单System.DateTimeOffset的结构布局类型设置为“Auto”.这可以看出:
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有这个不寻常的结构布局?
解决方法
这将需要投机,这个决定是在很久以前,就在.NET 1.0发布之前. System.DateTime中的属性最多只是一个微型优化,在.NET代码中并不罕见.这有点合适,结构只有一个字段,所以布局永远不会有任何问题.内部CustomAttribute结构体的结构可能由同一个程序员完成.无论如何,非托管代码都不会看到它们.
System.DateTimeOffset的执行时间稍晚,几乎肯定是一个复制粘贴错误.
那个程序员已经离开了,CLR没有理由重新排列顺序版本的布局.当自动布局重新排列时,如果结构体包含足够大以适合另一个小字段的字段之间的填充,就会发生.不是DateTimeOffet的情况.
当您提交DateTimeOffset的反馈报告时,您有一些可能会让Microsoft上师注意这一点.这是错误的afaik.发布到connect.microsoft.com