c#object.Dispose()或object = null

时间:2013-08-19 15:39:45

标签: c# .net dispose

嗨,我有一个对象是Disposable,我想知道什么是更好的:

this.object.Dispose();

this.object = null;

this.object.Dispose();
this.object = null;

4 个答案:

答案 0 :(得分:12)

Dispose更好,更好的方法是使用using块内的对象并让框架处理它。

对于:this.object.Dispose(); vs this.object = null;

将对象设置为null可能会导致未管理的资源被取消。拥有IDisposable的整个目标是确保在使用后取消管理资源

请参阅:IDisposable - MSDN

  

此接口的主要用途是释放非托管资源。   垃圾收集器自动释放分配给的内存   不再使用该对象时的托管对象。但事实并非如此   可以预测何时会发生垃圾收集。此外,   垃圾收集器不了解非托管资源,例如   窗口句柄,或打开文件和流。

答案 1 :(得分:2)

您只需要Dispose该对象 - 您不需要将其设置为null,除非有其他代码检查空值并做出适当的响应。

答案 2 :(得分:2)

Dispose并不比设置为null更好或更差。它们用于不同的目的。

  • 将其设置为null以释放对该对象的引用,以便垃圾收集器可以收集它。请记住,如果存在其他对象的其他引用,则可能没有任何效果。范围在这里起着重要作用(记住闭包,静态对象引用,事件委托等)。
  • 如果开发人员在对象上实现了IDisposable,则调用Dispose()。我将IDisposable接口视为“开发者合同”,它允许我们看到“嘿,此对象自行清理,但也提供了一种公开方法来明确清理它!”。

因为如果正确实现,对象的终结器应调用Dispose()方法,大多数情况下您不需要显式调用它。只要没有对象的引用,终结器方法就会被垃圾收集器调用,从而调用Dispose方法。

答案 3 :(得分:0)

  

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; 

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