【问题标题】:Why this Dispose() method need, since .net have Automatic Garbage collector为什么需要这个 Dispose() 方法,因为 .net 有自动垃圾收集器
【发布时间】:2011-07-08 01:06:37
【问题描述】:

在我之前的帖子中,当我生成批量 pdf(超过 1000 页)时,我发布了一个错误“加载报告失败”。然后我给了 obj.Dispose() 它解决了我的问题。那么,谁能告诉我点网中 Dispose() 和垃圾收集器的实际功能是什么。

谢谢, saj

【问题讨论】:

标签: asp.net


【解决方案1】:

.NET 垃圾收集器管理托管对象(本机 .NET 对象)的内存,但它不管理,也不能直接清理非托管资源。托管资源是由垃圾收集器隐式清理的资源。您不必编写代码来显式释放此类资源。相反,您必须在代码中显式清理非托管资源(文件句柄、数据库集合等)。

【讨论】:

  • 好的,但是如果我可以编写一个带有 getter/setter 的对象,这些对象在非托管资源中获取和设置数据,然后释放该资源,那么 Microsoft 为什么不能呢?
【解决方案2】:

垃圾收集器仅适用于托管对象。当您有一个由类分配的 unmanaged 内存时使用 Dispose,因为当类不使用时需要手动释放它。如果您没有实现 dispose 模式(您似乎这样做了),那么内存永远不会被释放,并且您有非托管内存的内存泄漏。如果您这样做但不调用它,则您依赖于运行(并调用 Dispose)的垃圾收集器来释放非托管内存,这可能会或可能不会在您需要的时间范围内发生。 (几乎)总是最好将实现 IDisposable 的类的对象包装在 using 语句中,以保证在对象超出范围时调用 Dispose 方法。

using (var obj = new DisposableObject())
{
    ...
}

【讨论】:

    【解决方案3】:

    看到这个问题:How to dispose a class in .net?

    IDisposable 与 释放内存。 IDisposable 是一个 释放非托管资源的模式...

    【讨论】:

      【解决方案4】:

      当不再需要该对象时,任何实现 IDisposable 的对象都会调用 Dispose()。此方法负责释放已分配的系统资源。此模式提供对象的急切集合。

      使用 sn-p 包含实例化和使用一次性资源的代码块是一个好习惯:

      using (var disposable = new Disposable())
      {
          // your code goes here
      }
      

      不知道 GC 何时运行,它可能会保留资源超过必要的时间。

      【讨论】:

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