我想询问我是否正确使用此示例,因此如果您将引用类型分配给引用类型,如:
ClassName p1 = new ClassName();
ClassName p2 = p1;
所以如果我说第一行,当你创建引用变量(类)时,一次发生了两件事。首先,在HEAP(在内存中的某个地址上)创建引用类型(类)的对象,然后在堆栈上创建对HEAP上的此创建对象的引用(创建对象的放置地址),并将其存储在变量
对于第二行,我知道,从p1引用将被复制到p2,因此p2和p1将具有指向内存(堆)中相同对象的相同引用。但我真的想知道背后发生了什么。我也知道,存储在引用变量中的引用是在堆栈上分配的。
因此,如果我说出将参考类型分配给参考类型背后真正发生的事情。它会是:因为引用("地址"对象在内存中)实际上就像"值类型" (我不是指堆上的对象),所以将引用类型分配给引用类型,我可以理解为按值分配引用(地址)?
感谢您的回答。
答案 0 :(得分:2)
虽然存在很多差异;参考在概念上类似于存储器地址;变量只存储地址,因此将地址分配给另一个变量只允许它访问同一个内存实例。
引用类型内存存储在堆上,而不是堆栈,但是地址'指针' (变量)存储在堆栈中。当它们超出所有堆栈范围和线程存储范围时,堆内存将被释放。
托管内存系统与C中的地址/指针概念之间存在许多细微差别,但在您的问题范围内,似乎您有正确的理解。