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

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

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

static void Main(string[] args) { byte b = 1; } 

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

 mov dword ptr [ebp-40h],1 

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

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

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

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

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

说明:

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

有办法绕过这个(通过直接的MSIL生成),但如果你实际上想要同一个对象的非托管表示的大小,那么你可能想要使用Marshal.SizeOfsizeof实际上并没有看起来那么有用 – 它只是更方便。

还有一个硬核SOS选项,它将为您提供对象大小的真实值。

使用!ObjSize命令

 ==Immediate Window== .load sos !ObjSize 

您可能需要四处寻找对象的地址。 检查!Dump*命令,例如!DumpHeap!DumpStack

我不确定我是否理解它,但是有一个运算符sizeof() 。

 Console.WriteLine(sizeof(byte)); 

还有一个与引用类型相关的答案: 使用C#获取字段大小(以字节为单位)

我很确定您要求的是某种数据类型消耗的内存量是多少? 我会使用sizeof()方法,因此:

 int a = 2; 

您可以找到int占用多少空间:

 Console.WriteLine(sizeof(int);