【问题标题】:The primary use of IDisposable interface [duplicate]IDisposable接口的主要用途[重复]
【发布时间】:2011-09-20 20:56:42
【问题描述】:

可能重复:
Proper use of the IDisposable interface

"IDisposable Interface" article 告诉:

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

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

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

附言

我相信已经有关于这个主题的问题,但找不到。

【问题讨论】:

  • 托管资源由垃圾收集器自动清理。 IDiposable 提供了一种释放非托管资源的标准方式。
  • 在这里试试 - 很多有用的信息:stackoverflow.com/questions/538060/…

标签: c# .net idisposable


【解决方案1】:

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

垃圾收集器自动 释放分配给 a 的内存 当该对象为 no 时的托管对象 使用时间更长。然而,它不是 可以预测什么时候垃圾 将发生收集。此外, 垃圾收集器没有知识 非托管资源,例如窗口 句柄,或打开文件和流。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 尽管如此,问题因重复而关闭,我想接受这个答案。大卫,你是唯一一个让我注意到与 DB 的连接实际上是非托管资源的人......这是有道理的。我知道我总是需要关闭它(或处置),但我一直认为它们被命名为“托管”。谢谢!
    【解决方案3】:

    IDisposable.Dispose()负责两件事:

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

    【讨论】:

      【解决方案4】:

      你的回答

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

      托管资源的生命周期由垃圾收集器控制。这是您使用 C# 或 Java 的好理由之一。

      【讨论】:

        【解决方案5】:

        考虑“责任”,而不是“非托管资源”。当一个对象被描述为持有“未管理的资源”时,真正的意思是:

        1. 班级拥有对外部实体做某事所需的信息和动力。
        2. 如果该操作从未完成,则其他操作将无法正常工作(影响可能很小或很严重)。
        3. 如果该类不执行该操作,则其他都不会。

        一个类有清理职责的最常见情况是,当某个其他实体被要求保留某些东西(可能是文件、GDI 句柄、锁、数组槽、内存块、通信通道或其他任何东西)直到进一步注意。如果没有任何东西告诉其他实体不再需要它保留的东西,它永远不会允许其他任何东西使用它。

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

        1. 如果一个对象实现了 IDisposable,则应该安排“某人”(另一个对象或正在运行的过程)在它被放弃之前调用 Dispose 方法。不应将 Dispose 视为销毁对象,而是告诉对象执行其最终职责,以便可以安全地放弃它。
        2. 对象可以要求系统在它们被遗弃时通知它们,然后再被扫走。虽然此类通知可以降低可能永远不会执行所需操作的危险,但依赖它们是危险的,因为它们通常不会以特别及时的方式出现,并且在某些情况下可能根本不会出现。

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

        【讨论】:

          猜你喜欢
          • 2013-12-14
          • 2016-08-13
          • 1970-01-01
          • 2011-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-09
          相关资源
          最近更新 更多