Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在何处存储对引用类型的堆内存的引用?_C#_.net_Reference Type - Fatal编程技术网

C# 在何处存储对引用类型的堆内存的引用?

C# 在何处存储对引用类型的堆内存的引用?,c#,.net,reference-type,C#,.net,Reference Type,简单代码,例如: Object test=new Object(); 我知道test对象的内存分配到了堆中 引用MSDN: 引用类型的变量存储对其数据(对象)的引用 但我真的不明白这个变量值(对堆数据的引用)存储在堆栈、堆或其他地方的什么地方?test变量存储在堆栈上-它保存堆上对象的地址。对象实例存储在堆上 我建议你们阅读杰弗里·里克特的文章: 从托管堆分配对象时,新的运算符 返回对象的内存地址。你通常会储存这个 变量中的地址。这称为引用类型变量 因为变量实际上不包含对象的位; 相反,变量引

简单代码,例如:

Object test=new Object();
我知道
test
对象的内存分配到了堆中

引用MSDN:

引用类型的变量存储对其数据(对象)的引用


但我真的不明白这个变量值(对堆数据的引用)存储在堆栈、堆或其他地方的什么地方?

test
变量存储在堆栈上-它保存堆上对象的地址。对象实例存储在堆上

我建议你们阅读杰弗里·里克特的文章:

从托管堆分配对象时,新的运算符 返回对象的内存地址。你通常会储存这个 变量中的地址。这称为引用类型变量 因为变量实际上不包含对象的位; 相反,变量引用对象的位

除了引用类型之外,虚拟对象系统还支持 称为值类型的轻量级类型。无法创建值类型对象 在垃圾收集堆上分配,变量表示 对象不包含指向对象的指针;变量 包含对象本身。由于变量包含对象,因此 指针无需取消引用即可操作 对象当然,这可以提高性能


谢谢你的回答。你能从msdn或其他来源添加证据吗?@Frank59在msdn上很难找到关于这方面的文档,但这里有一篇关于这个主题的好文章@Frank59文章说变量存储在堆栈上。它还表示引用类型实例是在堆上分配的。我认为您应该通过C#book了解Jeffrey Richter CLR,该书描述了CLR的内部结构,只是做了一些轻微的修改。
test
没有保存堆上对象的地址。它保存对堆上实际地址的引用。用户不能将引用视为地址,事实上,它们在实现中不一定包含地址