null
在实现Dispose()
方法时是否需要设置大对象?
如果一个类有一个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方法,以确保任何非托管资源的转售.
通常不是.
垃圾收集器查找有根对象,如果两个对象都没有根,则循环依赖关系不会阻止收集.
有一点需要注意:如果对象A具有对象B的引用,并且正在处理对象B,则可能需要清理该关系,否则最终可能会出现泄漏.此表面最常见的位置是事件处理程序(A-> B的引用是B控制的引用,因为它在A上订阅了一个事件).在这种情况下,如果A仍然有根,则即使已经处理了B,也无法收集B.