由于 DateTime 是一个结构体,其成员似乎可以分解为简单的数学值,我不确定为什么在其上使用 sizeof() 函数会产生问题标题中的消息。
static void Main()
{
int s;
unsafe
{
s = sizeof(DateTime);
}
Console.WriteLine(s); // writes 8
}
unsafe
关键字时,sizeof()
可以使用所有的 enum
类型和所有没有引用类型实例字段的 struct
类型(而且可以确定,DateTime
是一个没有引用类型成员的结构体)。unsafe
关键字,则不能使用 sizeof
。(但是,自 C# 2 起,您可以在预定义类型(如 int
)和 enum
类型上使用它,但不能在其他结构体上使用,比如 DateTime
。)DateTime
结构体是一个特殊的结构体,因为 Marshal.SizeOf<DateTime>()
(或 .NET 版本 4.5.1(2013)之前的 Marshal.SizeOf(typeof(DateTime))
) 会抛出异常。这是由于不寻常(对于结构体来说)的结构布局“Auto”。
unsafe
上下文中sizeof(DateTime)
将正常工作(请参见我的新答案)。 - Jeppe Stig NielsenMarshal.sizeof()
并不是必要准确的。sizeof()
使用的CIL操作码实际上可以很好地处理任何托管类型(类类型存储位置的大小将报告为对象引用的大小,这正是避免LOH所需的精确信息)。不幸的是,C#的设计者们决定程序员不应该访问这样的信息。 - supercat