如何确定.NET中的数据类型有多大?

Jos*_*den 7 c# memory types

我想加深对数据类型的理解,并想知道如何确定数据类型的大小.我希望通往答案的旅程能够揭开其他未知数.

我知道在.NET中,一个字节是一个8位无符号整数,但只是因为我读过它.如果我有一个非常简单的控制台应用程序,如下所示:

static void Main(string[] args)
{
byte b = 1;
}
Run Code Online (Sandbox Code Playgroud)

我怎么能在Visual Studio中告诉'b'的数据结构有多大?我看到有一些内存诊断窗口,但它只是说当我跳过b的分配时他们无法评估表达式.我打开了Disassembly窗口,可以看到mov op ...

mov         dword ptr [ebp-40h],1
Run Code Online (Sandbox Code Playgroud)

......但不确定信息的含义.我认为dword暗示了大小,也许ptr ebp-40h指向一个地址.有没有办法可以在Visual Studio中查看所有地址,也可以通过查看范围来收集大小?

我知道在这样一个简短的论坛中回答这些问题很难,但感谢您的帮助.

Jam*_*rgy 8

您可以使用它sizeof(T)来获取原始值类型和非引用类型的大小.对于其他类型,获取大小可能非常困难,因为引用类型通常没有固定大小.

这可能是简单类型之外的复杂问题(根据下面的讨论),但通常,如果类型的大小未由其数据结构明确定义,因为它本身是引用类型,或者它是包含引用类型的结构,那么就没有办法计算存储空间(因为根据定义,它不是固定的).

  • 此外,不仅没有固定的大小,而且*即使*只是嵌入"原始"类型,它仍然*不会*:struct S {IntPtr p; 肯定有一个大小(托管和非托管),它也不是一个固定的大小. (2认同)

Meh*_*dad 6

tl;dr: sizeof(YourType)应该给你“答案”,但Marshal.SizeOf可能更合适。

解释:

这并不总是有效。C# 不喜欢你打破它的抽象障碍,因此它只允许你找到结构的“大小”,如果该结构在托管和非托管代码中具有相同的大小(或者更准确地说,是“blittable”)。否则,C# 声称,“为什么你关心托管大小?它对你来说毫无用处”,并且不允许你获取sizeof托管类型的 。

有多种方法可以解决这个问题(通过直接生成 MSIL),但如果您实际上想要同一对象的非托管表示形式的大小,那么您可能需要使用Marshal.SizeOf它。sizeof实际上并不像看起来那么有用——它只是更方便。