2014-02-19 28 views
12

结构System.DateTime及其表亲System.DateTimeOffset的结构布局类型设置为“自动”。这可以看作与:为什么System.DateTime结构的布局类型为Auto?

typeof(DateTime).IsAutoLayout /* true */ 

或:

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

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

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

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

我通过一些常见的BCL程序集进行搜索,DateTimeDateTimeOffset是我在此布局中发现的唯一公开可见的结构。

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

+1

有趣的事实。有关'Auto'的文档说*运行时自动为非托管内存中的对象成员选择适当的布局。使用此枚举成员定义的对象不能在托管代码之外公开。试图这样做会产生一个异常。*也许这只用于强制使用托管代码。原因可能是在.NET历史中布局多次改变(只​​是一个假设)。更多:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.layoutkind.aspx – ZoolWay

+0

'auto'似乎没问题,也许这个问题应该是为什么这么少的其他类型使用它。 –

+0

@ZoolWay我也认为这些线。请注意,我们仍然可以在C#中使用'DateTime *'指针类型,并使用'unsafe'上下文,例如,此程序可以正常工作:'不安全 int [] memory = {123,456,789,333,666, 999,}; fixed(int * pointer =&memory [0]) { var pointer2 =(DateTime *)pointer; Console.WriteLine(pointer2-> DayOfWeek); pointer2 + = 2; Console.WriteLine(pointer2-> DayOfWeek); } }'。 –

回答

10

这是需要猜测的,这个决定在012年之前做了一个long,远早于.NET 1.0出货。 System.DateTime上的属性至多是微型优化,在.NET代码中并不罕见。这有点合适,结构只有一个字段,所以布局从来没有任何问题。用于内部CustomAttribute结构的那些可能是由同一个程序员完成的。无论如何,非托管代码都不会看到它们。

System.DateTimeOffset之一很晚了,几乎肯定是一个复制粘贴错误。

程序员逃过了一劫,没有理由让CLR重新安排顺序版本的布局。当结构包含足够大的字段以填充另一个小字段时,会发生重新排列自动布局。不是DateTimeOffet的情况。

当您为DateTimeOffset提交反馈报告时,您会得到Microsoft专家的关注。这是错误的。发布到connect.microsoft.com

+0

Ineteresting。将考虑提交该错误报告。但结构'TimeSpan'和DateTime一样古老,它也只有一个实例字段,那么为什么这个“微优化”不适用于'TimeSpan'?你有什么主意吗? –

+4

TimeSpan是[ComVisible(true)],与DateTime不同。 –

+0

[提交给连接](https://connect.microsoft.com/VisualStudio/feedback/details/820333/the-struct-type-system-datetimeoffset-has-layout-auto-even-if-it-has-two -instance-字段)。 –

相关问题