.NET DateTime 没有预定义的大小

发布于 2024-11-25 13:26:08 字数 76 浏览 2 评论 0原文

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

Since DateTime is a struct with members that appear to break down into simple mathematical values, I'm not sure why using sizeof() on it produces the message in the question title.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

挽你眉间 2024-12-02 13:26:08

因为 CLR 只能在运行时确定大小...原因之一是“填充”(平台相关)...

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

参考

另请参阅如何检查字节数被结构消耗?

Because the CLR can only determine the size at runtime... one of the reasons for this is "padding" (platform dependent)...

For all other types, including structs, the sizeof operator can be
used only in unsafe code blocks. Although you can use the
Marshal.SizeOf method, the value returned by this method is not always
the same as the value returned by sizeof. Marshal.SizeOf returns the
size after the type has been marshaled, whereas sizeof returns the
size as it has been allocated by the common language runtime,
including any padding
.

Ref.

see also How do I check the number of bytes consumed by a structure?

白龙吟 2024-12-02 13:26:08

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

错误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 类型(当然,DateTime 是没有引用类型成员的结构)。

如果没有 unsafe 关键字,则无法使用 sizeof。 (但是,从 C# 2 开始,您可以在 int 等预定义类型和 enum 类型上使用它,但不能在 DateTime 等其他结构上使用它。 code>,如您所见。)


请注意,DateTime 结构的特殊之处在于 Marshal.SizeOf() (或.NET 版本 4.5.1 (2013)) 之前的 Marshal.SizeOf(typeof(DateTime)) 将引发异常。这是因为不寻常的(对于struct)结构布局“Auto”。

The full error text you get, is:

error CS0233: 'System.DateTime' does not have a predefined size, therefore
sizeof can only be used in an unsafe context (consider using
System.Runtime.InteropServices.Marshal.SizeOf)

So if you do use unsafe context (be sure to go to the C# project's "Properties", the "Build" tab, and set a check mark in "Allow unsafe code" to make the below compile) it works fine:

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

With the unsafe keyword, sizeof() will work with all enum types and with all struct types that do not have instance fields of reference type (and DateTime is a struct with no reference type members, for sure).

Without the unsafe keyword, you cannot use sizeof. (However, since C# 2 you are allowed to use it on pre-defined types like int and on enum types, but not on other structs like DateTime, as you saw.)


Note that the DateTime struct is exceptional in that Marshal.SizeOf<DateTime>() (or Marshal.SizeOf(typeof(DateTime)) prior to .NET version 4.5.1 (2013)) will throw an exception. This is because of the unusual (for a struct) structure layout "Auto".

懷念過去 2024-12-02 13:26:08

Alex Pinsker wrote nice solution for getting the size of DateTime (or any other type).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文