【发布时间】:2014-03-19 20:18:53
【问题描述】:
结构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 来指定另一个布局)。
我搜索了一些常见的 BCL 程序集,DateTime 和 DateTimeOffset 是我发现的唯一公开可见的结构。
有人知道为什么DateTime 有这种不寻常的结构布局吗?
【问题讨论】:
-
有趣的事实。
Auto上的文档说 运行时会自动为非托管内存中的对象成员选择适当的布局。使用此枚举成员定义的对象不能暴露在托管代码之外。尝试这样做会产生异常。 也许这仅用于强制在托管代码中使用。其原因可能是布局在 .NET 历史中多次更改(只是一个假设)。更多:msdn.microsoft.com/en-us/library/… -
auto似乎还可以,也许问题应该是为什么其他类型很少使用它。 -
@ZoolWay 我也沿着这些思路思考。请注意,我们仍然可以在 C# 中使用
DateTime*指针类型和unsafe上下文,例如这个程序可以正常工作: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); } }。
标签: c# .net datetime struct structlayout