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; 

它引用的对象不再可访问,现在可以进行垃圾回收(托管资源)。 您必须自己处理未管理的资源。