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

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...