【问题标题】:c# object.Dispose() or object = nullc# object.Dispose() 或 object = null
【发布时间】:2013-08-21 11:35:18
【问题描述】:

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

this.object.Dispose();

this.object = null;

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

【问题讨论】:

标签: c# .net dispose


【解决方案1】:

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

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

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

见:IDisposable - MSDN

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

【讨论】:

  • 我会说调用Dispose 或使用using 块是必须的.​​.....以防万一类的创建者没有实现一次性模式(析构函数没有的坏情况'不调用 Dispose)。
  • Dispsoing 更好,但如果您的资源紧张,即移动设备,那么您应该调用 null 这样您就不必等待。但是在资源紧张的情况下将其设置为 null 而不进行处置是一个坏主意,因为您正在等待 GC 收集和释放与它们相关联的资源。如果对象使用硬件资源,则应始终调用 Dispose。
  • @NickTurner,将对象设置为 null 甚至被 GC 收集并不能确保调用 Dispose。一个好的做法是在Finalize 中调用Dispose,但可能并不总是如此。一般规则是Dispose 任何实现IDisposable 的东西,然后再将其设置为空(Task 除外:))
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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; 
    

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        相关资源
        最近更新 更多