【问题标题】:Why do we need Dispose() method on some object? Why doesn't the garbage collector do this work?为什么我们需要在某个对象上使用 Dispose() 方法?为什么垃圾收集器不做这项工作?
【发布时间】:2011-07-26 01:08:10
【问题描述】:

问题是:为什么我们需要在某些对象上调用Dispose()?为什么垃圾收集器在超出范围时不收集对象?我试图理解为什么它是这样实施的。我的意思是,如果在垃圾收集器收集超出范围的对象时调用 Dispose() 会不会更容易。

【问题讨论】:

    标签: c# garbage-collection dispose


    【解决方案1】:

    垃圾收集器是非确定性的 - 它在对象不再被引用后在某个时间点收集对象,但不能保证及时发生。与引用计数相比,这具有多种好处,包括允许循环依赖以及不随处增加和减少计数器的性能优势。

    但是,这确实意味着对于 应该 及时清理的资源(例如数据库连接、文件句柄等 - 几乎除了内存之外的任何东西),您仍然需要显式处理资源。 using 声明使这很容易。

    【讨论】:

    • 好吧,我有一个正在生成位图的应用程序,我没有调用 dispose() 并且该应用程序开始消耗千兆字节的内存。 altought 我每 20 秒创建一个位图,它会立即保存到磁盘并超出范围。但垃圾收集器似乎根本不起作用。因为内存只会增加。
    • @Karim:嗯,你当然应该处理掉那些位图。您必须查看发生了什么 GC 等,以诊断为什么最终没有收集它们 - 但是 Image 实现 IDisposable 是有原因的......
    【解决方案2】:

    Dispose 用于清理非托管资源(例如,数据库连接的包装器、旧的 COM 库......)。

    编辑: 一些 MSDN 链接以及更多详细信息:
    http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx
    http://msdn.microsoft.com/en-us/library/0xy59wtx(VS.71).aspx

    要指定当垃圾收集器回收对象时非托管资源会发生什么,您必须重写受保护的 Finalize() 方法: http://msdn.microsoft.com/en-us/library/system.object.finalize(VS.71).aspx

    【讨论】:

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