2

我有一个代码,如下所示。我在一次采访中被问到

object global;
void f()
{
  object local=new object();
  global=local;
}

他问,“全局null在函数之外吗?”。由于变量在函数之外失去了它的作用域,并且它的引用也应该local是给它的,但这不是为什么?globalnull

4

2 回答 2

10

您必须区分变量和值。

局部变量只存在于函数内部,但这并不意味着该变量所包含的值不存在于函数外部。

当您分配 to 的值时localglobal您正在复制对该对象的引用,以便有两个对同一对象的引用。当您离开函数时,局部变量会消失,但您复制到全局变量的值仍然存在,并且对象仍然存在,因为仍然存在对它的引用。

于 2012-04-18T06:25:23.813 回答
0

我对这个问题进行了大量研究,发现这种行为的唯一原因是由于 .Net 垃圾收集。

GC 根本身不是对象,而是对对象的引用。GC 根引用的任何对象都将自动在下一次垃圾回收中存活。

由于 local 是一个局部变量,它将保留在 GC 根中,并且由于它被 global 引用,因此它在 GC 中仍然存在。您可以在

http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

于 2012-04-20T04:34:55.833 回答