来自Nutshell中的C#5.0:第22页的权威参考 ;
引用类型需要为引用和对象单独分配内存.该对象消耗与其字段一样多的字节,以及额外的管理开销.精确的开销对于.NET运行时的实现本质上是私有的,但至少开销是八个字节,用于存储对象类型的键,以及临时信息,例如多线程的锁状态和标志.指示它是否已被垃圾收集器移动固定.每个对象的引用都需要额外的四个或八个字节,具体取决于.NET运行时是在32位还是64位平台上运行.
我不太确定我完全理解这个大胆的部分.它说在32位平台上一个引用需要四个字节,在64位平台上它需要八个字节.
所以,让我们说我们有
string s = "Soner";
Run Code Online (Sandbox Code Playgroud)
如何检查此s引用所需的字节数?
你可以用Environment.Is64BitProcess.如果是,则每个引用将为8个字节.如果不是,则每个引用将是4个字节.引用的类型以及它引用的对象的内容是无关紧要的.
编辑:如现在删除的答案中所述,IntPtr.Size甚至更简单.
编辑:正如评论中所述,虽然目前 CLR中的所有引用都是相同的大小,但在某些时候它可能会沿着类似的路径走向Hotspot,Hotspot在很多情况下使用"压缩oops"将引用存储为32即使在64位进程中也可以使用-bit值(不限制可用内存).