Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 垃圾收集将对象设置为null_C#_.net - Fatal编程技术网

C# 垃圾收集将对象设置为null

C# 垃圾收集将对象设置为null,c#,.net,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; } } 如果执行testClass=null,会发生什么?testClass现在对堆的引用是什么?那么持有一个无法收集的值的D呢 编辑:只是澄清一下,给定的D

给定

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

public class A
{
 public B First { get; set; }
}       
public class B
{
 public C Second { get; set;}
}
public class C 
{ 
 public D Third { get; set; }  
}
如果执行testClass=null,会发生什么?testClass现在对堆的引用是什么?那么持有一个无法收集的值的D呢

编辑:只是澄清一下,给定的D有一个尚未取消订阅的事件,并且有10000个处理程序。testClass=null会发生什么情况?

当执行testClass=null时,对象仍保留在堆上。但是在代码中不再有对它的任何引用。它符合垃圾收集的条件

作为字段的任何对象也将不再在任何位置引用。他们也有资格进行垃圾收集。。等等

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

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

如果D引用非托管资源,那么当您设置testClass=null时,它仍然可以进行垃圾收集。但是,除非D实现一个显式清理非托管资源的终结器,否则它将泄漏

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


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

如果订阅的某个属性引用了它无法收集的值,该怎么办?像它引用的类,并且它内部有非托管代码?我输入了这些值,但在其中添加了一条注释,说明所有属性都已分配给某个对象,并且D引用的对象中包含无法收集的非托管代码。@LeoLorenzoLuis-除非具有非托管引用的类实现终结器,否则这将是内存泄漏。很好的参考:@RobertLevy更新了我的问题,是的,这是我的问题,如果我执行testData=null并且出现内存泄漏,会发生什么?@LeoLorenzoLuis:如果类引用了非托管资源,那么最好实现标准的Dispose Finalize模式。请参见此处:@LeoLorenzoLuis:请参见更新的答案,以考虑到D持有的非托管资源
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..