在实施null
方法时,是否有必要将大对象设置为Dispose()
?
答案 0 :(得分:5)
如果某个类有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方法,以确保任何非托管资源的转售
答案 1 :(得分:5)
通常不会。
垃圾收集器查找有根对象,如果两个对象都没有根,则循环依赖关系不会阻止收集。
有一点需要注意:如果对象A具有对象B的引用,并且正在处理对象B,则可能需要清理该关系,否则可能会导致泄漏。此表面最常见的位置是事件处理程序(A-> B的引用是B控制的引用,因为它在A上订阅了一个事件)。在这种情况下,如果A仍然有根,则即使已经处理了B,也无法收集。
答案 2 :(得分:3)
dispose方法的目的是通过调用基类dispose方法释放与您的类关联的所有资源以及父类。阅读这个链接,它应该让事情更清楚:
答案 3 :(得分:1)
“大型物体”是什么意思?
你应该至少在任何实现IDisposable的成员上调用Dispose()。
答案 4 :(得分:1)
没有必要像其他人指出的那样,但这是一种很好的做法,有助于调试。
一个对象使用指针完成后,它正在使用然后将其设置为null有助于防止以后重用该对象(您将获得空引用异常)。
同样的逻辑适用于在删除C ++析构函数后将成员指针设置为null。没有需要来做这件事,但它有助于以后进行故障排除。
答案 5 :(得分:0)
考虑一下Disposable方法的目的:通常是因为你持有一些在垃圾收集过程中不会被释放的资源。这通常类似于数据库连接或文件句柄。因此,一旦调用了Dispose方法,就会释放所有这些资源。
我认为,如果让“僵尸”物体漂浮在周围,那么漂浮的空值会更有害。