IDisposable接口的主要用途

本文关键字:接口 IDisposable | 更新日期: 2023-09-27 17:59:57

可能重复:
正确使用IDisposable接口

"IDisposable接口"文章告诉:

此接口的主要用途是释放非托管资源

为什么为什么只管理?

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

第页。S.

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

IDisposable接口的主要用途

数据库的底层连接不受管理,文件句柄和许多其他低级o/s对象也是如此。它们不受管理。实现IDisposable接口意味着您不仅仅依赖垃圾收集器来释放这些资源;但您正在使用您现有的低级别API关闭这些资源。

此外,我认为Eric Lippert对类似问题的回答(倒数第二个)很好地解释了为什么要使用IDisposable

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

垃圾收集器自动释放分配给的内存托管对象,而该对象不是使用时间更长。然而,事实并非如此可以预测何时出现垃圾将进行收集。此外垃圾收集器一无所知非托管资源(如window)的处理或打开文件和流。

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

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

IDisposable.Dispose()负责两件事:

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

您对的回答

为什么为什么只管理?

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

不要考虑"非托管资源",而应该考虑"责任"。当一个对象被描述为持有"未修改的资源"时,这真正意味着:

  1. 类具有对外部实体做某事所必需的信息和动力。
  2. 如果这一行动从未完成,其他事情就不会像其他事情那样奏效(影响可能很小,也可能很严重)。
  3. 如果类is不执行该操作,则不会执行其他操作。

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

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

  1. 如果一个对象实现IDisposable,则应该指定"某人"(另一个对象或正在运行的过程)在放弃Dispose方法之前调用该方法。处置不应该被认为是摧毁一个物体,而是告诉一个物体履行其最终责任,这样它就可以被安全地抛弃。
  2. 物体可以要求系统在它们被冲走之前告知它们何时被遗弃。虽然这种通知可以减少所需行动可能永远无法执行的危险,但依赖它们是危险的,因为它们通常不会特别及时地发出,在某些情况下可能根本不会发出。

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