7

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

4

6 回答 6

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 方法,以确保任何非托管资源的真实性。

于 2008-09-08T15:37:41.363 回答
5

通常不会。

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

有一个警告:如果对象 A 引用了对象 B,并且正在处理对象 B,您可能需要清理该关系,否则最终可能会导致泄漏。这个表面最常见的地方是在事件处理程序中(来自 A->B 的引用是 B 控制的,因为它订阅了 A 上的事件)。在这种情况下,如果 A 仍然有根,则即使 B 已被处理,也无法收集 B。

于 2008-09-08T15:39:41.967 回答
3

dispose 方法的目的是通过调用基类的 dispose 方法来释放与您的类和父类关联的所有资源。阅读此链接,它应该使事情更清楚:

http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

于 2008-09-08T15:37:48.057 回答
1

“大物体”是什么意思?

不过,您至少应该在任何实现 IDisposable 的成员上调用 Dispose()。

于 2008-09-08T15:38:00.100 回答
1

正如其他人指出的那样,这不是必需的,但这是一种很好的做法,有助于调试。

一旦对象完成了它正在使用的指针,然后将其设置为 null 有助于防止以后重用该对象(您将获得 null 引用异常)。

同样的逻辑适用于在 C++ 析构函数中将成员指针设置为空,一旦你删除了它们。没有要这样做,但它有助于稍后进行故障排除。

于 2008-09-08T15:52:40.890 回答
0

想一想 Disposable 方法的用途:这通常是因为您持有一些在垃圾收集期间不会释放的资源。这通常类似于数据库连接或文件句柄。因此,一旦调用了 Dispose 方法,所有这些资源都已被释放。

我认为让空值漂浮比让“僵尸”对象漂浮更有害。

于 2009-05-27T18:17:05.157 回答