3

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

this.object.Dispose();

或者

this.object = null;

或者

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

4 回答 4

12

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

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

将对象设置为null可能会导致遗漏未处置的非托管资源。拥有的全部目的IDisposable是确保非托管资源在使用后被处置。

请参阅:IDisposable - MSDN

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

于 2013-08-19T15:41:08.327 回答
2

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

  • 将其设置为 null 以释放对该对象的引用,以便垃圾收集器可以收集它。请记住,如果有来自其他对象的其他引用,这可能不会有任何影响。作用域在这里扮演着重要的角色(记住闭包、静态对象引用、事件委托等)。
  • 如果开发人员在对象上实现了 IDisposable,则调用 Dispose()。我将 IDisposable 接口视为“开发人员合同”,它允许我们看到“嘿,这个对象会自行清理,但也提供了一个公共方法来显式清理它!”。

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

于 2013-08-21T15:30:08.343 回答
2

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

于 2013-08-19T15:42:04.323 回答
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();

现在将其设置为空怎么办?

Test t = new Test();
t = null; 

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

于 2013-08-19T15:47:00.613 回答