.NET DateTime没有预定义的大小

时间:2011-07-24 00:22:33

标签: .net datetime struct size sizeof

由于DateTime是一个结构,其成员似乎分解为简单的数学值,我不确定为什么在其上使用sizeof()会在问题标题中生成消息。

3 个答案:

答案 0 :(得分:7)

因为CLR只能在运行时确定大小...其中一个原因是“填充”(取决于平台)......

  

对于所有其他类型,包括结构,sizeof运算符都可以   仅用于不安全的代码块。虽然你可以使用   Marshal.SizeOf方法,此方法返回的值并不总是如此   与sizeof返回的值相同。 Marshal.SizeOf返回   类型被封送后的大小,而sizeof返回   size ,因为它已由公共语言运行库分配,   包括任何填充

Ref

另见How do I check the number of bytes consumed by a structure?

答案 1 :(得分:1)

您获得的完整错误文本是:

  

错误CS0233:'System.DateTime'因此没有预定义的大小   sizeof只能在不安全的环境中使用(考虑使用   System.Runtime.InteropServices.Marshal.SizeOf)

因此,如果您使用unsafe上下文(请务必转到C#项目的“属性”,“构建”选项卡,并在“允许不安全代码”中设置复选标记以进行以下编译)它工作正常:

    static void Main()
    {
        int s;
        unsafe
        {
            s = sizeof(DateTime);
        }
        Console.WriteLine(s); // writes 8
    }

使用unsafe关键字,sizeof()将适用于所有enum类型以及所有struct类型,这些类型不具有引用类型的实例字段(以及{{1是一个没有引用类型成员的结构,当然)。

如果没有DateTime关键字,则无法使用unsafe。 (但是,由于C#2允许您在sizeofint类型等预定义类型上使用它,但在enum之类的其他结构上不允许使用它,如您所见。)< / p>


请注意,DateTime结构是例外的,DateTime(或.NET版本4.5.1(2013)之前的Marshal.SizeOf<DateTime>())将引发异常。这是因为异常(对于Marshal.SizeOf(typeof(DateTime)))结构布局“自动”。

答案 2 :(得分:0)

Alex Pinsker写了nice solution来获取DateTime(或任何其他类型)的大小。