我想加深对数据类型的理解,并想知道如何确定数据类型的大小.我希望通往答案的旅程能够揭开其他未知数.
我知道在.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中查看所有地址,也可以通过查看范围来收集大小?
我知道在这样一个简短的论坛中回答这些问题很难,但感谢您的帮助.
您可以使用它sizeof(T)来获取原始值类型和非引用类型的大小.对于其他类型,获取大小可能非常困难,因为引用类型通常没有固定大小.
这可能是简单类型之外的复杂问题(根据下面的讨论),但通常,如果类型的大小未由其数据结构明确定义,因为它本身是引用类型,或者它是包含引用类型的结构,那么就没有办法计算存储空间(因为根据定义,它不是固定的).
tl;dr: sizeof(YourType)应该给你“答案”,但Marshal.SizeOf可能更合适。
这并不总是有效。C# 不喜欢你打破它的抽象障碍,因此它只允许你找到结构的“大小”,如果该结构在托管和非托管代码中具有相同的大小(或者更准确地说,是“blittable”)。否则,C# 声称,“为什么你关心托管大小?它对你来说毫无用处”,并且不允许你获取sizeof托管类型的 。
有多种方法可以解决这个问题(通过直接生成 MSIL),但如果您实际上想要同一对象的非托管表示形式的大小,那么您可能需要使用Marshal.SizeOf它。sizeof实际上并不像看起来那么有用——它只是更方便。