我有一个代码,如下所示。我在一次采访中被问到
object global;
void f()
{
object local=new object();
global=local;
}
他问,“全局null
在函数之外吗?”。由于变量在函数之外失去了它的作用域,并且它的引用也应该local
是给它的,但这不是为什么?global
null
您必须区分变量和值。
局部变量只存在于函数内部,但这并不意味着该变量所包含的值不存在于函数外部。
当您分配 to 的值时local
,global
您正在复制对该对象的引用,以便有两个对同一对象的引用。当您离开函数时,局部变量会消失,但您复制到全局变量的值仍然存在,并且对象仍然存在,因为仍然存在对它的引用。
我对这个问题进行了大量研究,发现这种行为的唯一原因是由于 .Net 垃圾收集。
GC 根本身不是对象,而是对对象的引用。GC 根引用的任何对象都将自动在下一次垃圾回收中存活。
由于 local 是一个局部变量,它将保留在 GC 根中,并且由于它被 global 引用,因此它在 GC 中仍然存在。您可以在
http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/