c#object.Dispose()或object = null
嗨,我有一个对象是Disposable,我想知道什么是更好的:
this.object.Dispose();
要么
this.object = null;
要么
this.object.Dispose(); this.object = null;
Dispose
更好,更好的方法是使用using
块内的对象并让框架处理它。
对于: this.object.Dispose();
vs this.object = null;
将对象设置为null
可能会导致未处理的未管理资源遗漏。 拥有IDisposable
的整个目标是确保在使用后处理未管理的资源 。
请参阅: IDisposable – MSDN
此接口的主要用途是释放非托管资源。 当不再使用该对象时,垃圾收集器会自动释放分配给托管对象的内存。 但是,无法预测垃圾收集何时发生。 此外,垃圾收集器不了解非托管资源,例如窗口句柄,或打开文件和流。
您只需要Dispose
对象 – 您不需要将其设置为null
,除非有其他代码检查空值并做出适当的响应。
Dispose并不比设置为null更好或更差。 它们用于不同的目的。
- 将其设置为null以释放对该对象的引用,以便垃圾收集器可以收集它。 请记住,如果有其他对象的其他引用,这可能没有任何影响。 范围在这里起着重要作用(记住闭包,静态对象引用,事件委托等)。
- 如果开发人员在对象上实现了IDisposable,则调用Dispose()。 我将IDisposable接口视为“开发者合同”,它允许我们看到“嘿,这个对象自行清理,但也提供了一种公共方法来明确地清理它!”。
因为, 如果正确实现 ,对象的终结器应调用Dispose()方法,大多数情况下您不需要显式调用它。 只要没有对象的引用,终结器方法就会被垃圾收集器调用,从而调用Dispose方法。
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;
它引用的对象不再可访问,现在可以进行垃圾回收(托管资源)。 您必须自己处理未管理的资源。