当前位置:  开发笔记 > 编程语言 > 正文

垃圾收集:是否有必要在Dispose方法中将大对象设置为null?

如何解决《垃圾收集:是否有必要在Dispose方法中将大对象设置为null?》经验,为你挑选了2个好方法。

null在实现Dispose()方法时是否需要设置大对象?



1> Espo..:

如果一个类有一个Dispose方法,最好的做法就是调用它.这背后的原因是Dispose在被调用时运行,而将对象设置为null只是在GC中向Finalize队列添加一个条目,我们无法确定GC何时运行.

在仅使用托管资源(例如数组)的类型上实现Dispose方法没有性能优势,因为它们由垃圾收集器自动回收.主要对使用本机资源的托管对象和公开给.NET Framework的COM对象使用Dispose方法.使用本机资源的托管对象(例如FileStream类)实现IDisposable接口.

采用Dispose的优雅方法是使用"using"结构.对于那些可能不熟悉该构造的人来说,它提供了一种暗示在实现IDisposable的实例上调用Dispose()的方法,即使在操作期间抛出异常也是如此.以下是using构造的示例:

using(DisposableClass dc = new DisposableClass()) 
{ 
   dc.PerformActionOnUmanagedResources(); 
   dc.PerformAnotherActionOnUmanagedResources(); 
} 

在前面的示例中,如果在PerformActionOnUmanagedResources()方法中抛出异常,虽然不会处理PerformAnotherActionOnUmanagedResources()方法,但using块仍然会在dc上调用Dispose方法,以确保任何非托管资源的转售.



2> Brad Wilson..:

通常不是.

垃圾收集器查找有根对象,如果两个对象都没有根,则循环依赖关系不会阻止收集.

有一点需要注意:如果对象A具有对象B的引用,并且正在处理对象B,则可能需要清理该关系,否则最终可能会出现泄漏.此表面最常见的位置是事件处理程序(A-> B的引用是B控制的引用,因为它在A上订阅了一个事件).在这种情况下,如果A仍然有根,则即使已经处理了B,也无法收集B.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有