关于c#:IDisposable接口的主要用途

The primary use of IDisposable interface

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Proper use of the IDisposable interface

"IDisposable Interface"文章说明:

The primary use of this interface is to release unmanaged resources

为什么?为什么只有非托管?

在我的一生中,我一直认为它的主要用途是释放任何资源:托管(到DBS的连接、服务代理等)和非托管(如果在应用程序中使用)。

附笔。

我相信这个话题已经有问题了,但找不到。


与文件句柄和许多其他低级O/S对象一样,数据库的底层连接不受管理。他们没有管理。实现IDisposable接口意味着您不仅仅依赖垃圾收集器来释放这些资源,而是使用可用的低级API来关闭这些资源。

另外,我认为埃里克·利珀特(EricLippert)对类似问题的回答(下一个)是一个很好的解释,解释了为什么你会使用IDisposable


如果你进一步阅读,有一个解释:

The garbage collector automatically
releases the memory allocated to a
managed object when that object is no
longer used. However, it is not
possible to predict when garbage
collection will occur. Furthermore,
the garbage collector has no knowledge
of unmanaged resources such as window
handles, or open files and streams.

垃圾收集器负责管理资源。这就是为什么它们是managed

此外,示例中的连接资源不是托管资源。.NET连接类包装非托管资源。


IDisposable.Dispose()负责两件事:

  • 释放对象可能拥有的非托管资源
  • 对象拥有的其他IDisposableDispose()

与其说是"未管理的资源",不如说是"责任"。当一个对象被描述为持有"未管理的资源"时,真正的意思是:

  • 类具有对外部实体做某事所必需的信息和动力。
  • 如果这一行动永远无法完成,那么其他事情也不会像以前那样奏效(影响可能很小或很严重)。
  • 如果类不执行该操作,则其他任何操作都不会执行。

    类具有清理职责的最常见情况是,要求其他实体保留某些内容(无论是文件、gdi句柄、锁、数组槽、内存块、通信通道或其他内容),直到另行通知。如果没有任何东西告诉另一个实体它保留的东西不再需要,它将永远不会允许任何其他东西使用它。

    如果一个具有执行某些操作的重要职责的对象在履行其职责之前被垃圾收集器清除,则该操作将永远不会被执行。有两种方法可以防止这种情况:

  • 如果一个对象实现了IDisposable,"某人"(另一个对象或正在运行的过程)应该在放弃之前调用Dispose方法。处置不应该被认为是破坏一个物体,而是告诉一个物体去履行它的最终责任,这样它就可以被安全地抛弃。
  • 对象可以要求系统在它们被冲走之前让它们知道什么时候被抛弃了。虽然此类通知可以减少可能永远无法执行所需操作的危险,但依赖它们是危险的,因为它们通常不会以特别及时的方式出现,而且在某些情况下可能根本不会出现。

    提供第二种清理方法的对象称为"托管资源"。



    你的答案

    为什么?为什么只有非托管?

    托管资源的生命周期由垃圾收集器控制。这是一个很好的原因,你使用C或Java。