C# IDisposable接口的主要用途

C# IDisposable接口的主要用途,c#,.net,idisposable,C#,.net,Idisposable,可能重复: 说明: 此接口的主要用途是释放非托管资源 为什么?为什么只有非托管 在我的一生中,我一直认为它的主要用途是释放任何资源:托管(到DBs的连接、服务代理等)和非托管(如果它们在应用程序中使用的话) 附言 我相信已经有关于这个主题的问题了,但是找不到它们。如果您进一步阅读,这里有一个解释: 垃圾收集器会自动关闭 释放分配给服务器的内存 当托管对象不是 不再使用。然而,事实并非如此 可以预测垃圾何时被丢弃 收集将发生。此外,, 垃圾收集器没有知识 非托管资源(如Windows)的 处理或

可能重复:

说明:

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

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

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

附言


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

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

垃圾收集器会自动关闭 释放分配给服务器的内存 当托管对象不是 不再使用。然而,事实并非如此 可以预测垃圾何时被丢弃 收集将发生。此外,, 垃圾收集器没有知识 非托管资源(如Windows)的 处理或打开文件和流

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


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

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

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

IDisposable.Dispose()
有两个原因:

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

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

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

      不要使用“非托管资源”,而要考虑“责任”。当一个对象被描述为持有“未更改的资源”时,其真正含义是:

    • 该类拥有对外部实体做某事所必需的信息和动力。
    • 如果这一行动永远无法完成,那么其他措施就不会像其他措施那样有效(影响可能很小,也可能很严重)。
    • 如果类不执行该操作,则其他任何操作都不会执行。 类承担清理责任的最常见的情况是,要求其他实体保留某些内容(文件、GDI句柄、锁、阵列插槽、内存块、通信通道等),直到另行通知。如果没有任何东西告诉其他实体它保留的东西不再需要,那么它将永远不允许其他任何东西使用它

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

    • 若一个对象实现了IDisposable,“某人”(另一个对象或正在运行的过程)应该被安排在放弃Dispose方法之前调用Dispose方法。处置不应被视为销毁一个对象,而是告诉一个对象履行其最终责任,以便可以安全地丢弃它。
    • 对象可以要求系统在它们被抛弃之前让它们知道它们何时被抛弃。虽然此类通知可以减少可能永远无法执行所需行动的危险,但依赖它们是危险的,因为它们通常不会以特别及时的方式发出,在某些情况下可能根本不会发出。
      提供第二种清理方法的对象称为“托管资源”。

      托管资源由垃圾收集器自动清理。IDiposable为非托管资源的释放提供了一种标准方法。请尝试此处--提供了很多好的信息:尽管这个问题是重复的,但我想接受这个答案。David,你是唯一一个注意到DB连接实际上是非托管资源的人。。。这是有道理的。我知道我总是需要关闭(或处置),但我一直认为它们被命名为“托管”。谢谢