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