鉴于
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
会发生什么?
答案 0 :(得分:3)
执行testClass = null
时,对象仍然在堆上。但是在代码中不再有任何引用它。它有资格进行垃圾收集。
任何A字段的对象都将不再被引用。他们也有资格进行垃圾收集......等等。
(碰巧,在您的特定代码中,从未分配字段First,Second和Third。它们仍为null,因此它们对讨论没有任何影响。)
请注意,此集合可能不会立即发生 - 设置testClass = null
本身不会触发集合。
如果D引用非托管资源,那么在设置testClass = null
时它仍然有资格进行垃圾回收。但除非D实现了Finalizer(它明确地清理了非托管资源),否则它将泄漏。
如果D是一个包含大量订阅的事件,那么即使您从未明确取消订阅,D仍然有资格获得GC。请参阅此答案here。
接下来,如果订阅本身是不再在其他任何地方引用的对象,那么它们也有资格收集。