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