c# object.Dispose() or object = null

本文关键字:object null or Dispose | 更新日期: 2023-09-27 18:28:09

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

this.object.Dispose();

this.object = null;

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

c# object.Dispose() or object = null

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

对于:this.object.Dispose();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; 

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