垃圾收集设置对象为null

时间:2013-12-13 02:06:45

标签: c# .net

鉴于

public class A
{
 public B First { get; set; }
}       
public class B
{
 public C Second { get; set;}
}
public class C 
{ 
 public D Third { get; set; }  
}

在班上的某个地方你有这个

var testClass = new A();
//All the properties have values in it and the class D has a property value that it is holding in to the memory
//testClass.B = new B();
//etc..

如果你做testClass = null会怎样? testClass现在对堆有什么参考?那D持有一个无法收集的价值呢?

编辑:只是为了澄清,因为D有一个尚未取消订阅的事件并且有10,000名处理程序。 testClass = null会发生什么?

1 个答案:

答案 0 :(得分:3)

执行testClass = null时,对象仍然在堆上。但是在代码中不再有任何引用它。它有资格进行垃圾收集。

任何A字段的对象都将不再被引用。他们也有资格进行垃圾收集......等等。

(碰巧,在您的特定代码中,从未分配字段First,Second和Third。它们仍为null,因此它们对讨论没有任何影响。)

请注意,此集合可能不会立即发生 - 设置testClass = null本身不会触发集合。

如果D引用非托管资源,那么在设置testClass = null时它仍然有资格进行垃圾回收。但除非D实现了Finalizer(它明确地清理了非托管资源),否则它将泄漏。

如果D是一个包含大量订阅的事件,那么即使您从未明确取消订阅,D仍然有资格获得GC。请参阅此答案here

接下来,如果订阅本身是不再在其他任何地方引用的对象,那么它们也有资格收集。