【发布时间】:2013-08-21 11:35:18
【问题描述】:
您好,我有一个对象是一次性的,我想知道什么更好:
this.object.Dispose();
或
this.object = null;
或
this.object.Dispose();
this.object = null;
【问题讨论】:
-
这里提出了类似的问题,stackoverflow.com/questions/2926869/…
您好,我有一个对象是一次性的,我想知道什么更好:
this.object.Dispose();
或
this.object = null;
或
this.object.Dispose();
this.object = null;
【问题讨论】:
Dispose 更好,更好的方法是使用using 块内的对象并让框架处理它。
对于:this.object.Dispose(); 与 this.object = null;
将对象设置为null 可能会导致遗漏未处置的非托管资源。拥有IDisposable 的全部目的是确保非托管资源在使用后被处置。
这个接口的主要用途是释放非托管资源。 垃圾收集器自动释放分配给 不再使用该对象时的托管对象。然而,它不是 可以预测何时会发生垃圾收集。此外, 垃圾收集器不了解非托管资源,例如 窗口句柄,或打开的文件和流。
【讨论】:
Dispose 或使用using 块是必须的......以防万一类的创建者没有实现一次性模式(析构函数没有的坏情况'不调用 Dispose)。
null 甚至被 GC 收集并不能确保调用 Dispose。一个好的做法是在Finalize 中调用Dispose,但可能并不总是如此。一般规则是Dispose 任何实现IDisposable 的东西,然后再将其设置为空(Task 除外:))
您只需要Dispose 对象 - 您不需要将其设置为null,除非有其他代码检查空值并做出适当的响应。
【讨论】:
object.Dispose() 或 object = null
什么是处置?任何实现 IDisposable 的类型通常都有这个方法(尽管你可以编写自己的公共方法)。
public class Test:IDisposable
{
public void Dispose()
{
//release resources here managed and unmanaged
}
}
现在你已经实现了 IDisposable 所以最好的方法是
using (Test t = new Test())
{
}
通过在使用块框架中执行此操作将处理所有资源。你不必担心。即使你对象的终结器方法应该为你调用 Dispose()
虽然你也可以这样做
Test t = new Test();
t.Dispose();
现在将其设置为 null 怎么样?
Test t = new Test();
t = null;
它引用的对象不再可访问,现在可以进行垃圾回收(托管资源)。您必须自己处理非托管资源。
【讨论】:
Dispose 并不比设置为 null 更好或更差。它们有不同的用途。
因为,如果正确实现,对象的终结器应该调用 Dispose() 方法,大多数时候您不需要显式调用它。一旦没有对该对象的引用,垃圾收集器就会调用终结器方法,从而调用 Dispose 方法。
【讨论】: