【问题标题】:General Rule for When to Implement IDisposable何时实施 IDisposable 的一般规则
【发布时间】:2009-07-14 14:18:35
【问题描述】:

编辑:此问题与What is the difference between managed and native resources when disposing? (.NET) 和许多其他问题重复。如果您有什么要补充的,请回答其他人。


根据 Krzysztof Cwalina 和 Brad Abrams 的框架设计指南,包含一次性类型实例的类型应实现 IDisposable。

对于何时实施 IDisposable 是最佳实践,还有其他一般经验法则吗?

【问题讨论】:

  • 这是一个多重的、超级重复的。请先搜索 SO 几分钟。
  • 我不同意这是“什么是差异..”的重复,因为上一个问题并没有真正说明最佳实践或包含实现 IDisposable 的字段。
  • 我确定它是重复的东西,但我不认为它与上面链接的问题完全相同。
  • @John Saunders:我很抱歉。实际上,我在发布我的问题之前确实进行了搜索,但没有找到一个我认为重复的问题——我的搜索失败。我遵循我在 meta.stackoverflow.com 上找到的逻辑:“围绕一个问题有多个微妙的变体通常是有好处的,因为人们倾向于使用完全不同的词来提问和搜索,而且我们的覆盖范围越好,我们的胜算就越大。其他程序员可以找到他们正在寻找的答案。”
  • 在这种情况下有用的另一个 MSDN 资源:msdn.microsoft.com/en-us/library/ms182172%28v=vs.80%29.aspx - 相关规则也适用于原始问题。

标签: .net design-patterns


【解决方案1】:

当你有一个包装非托管资源的类或当你的类有一个实现 IDisposable 的字段时,实现 IDisposable。

【讨论】:

    【解决方案2】:

    当你需要release非托管资源时,实现IDisposable

    【讨论】:

    • 如果你的类有实现 IDisposable 的字段,你也应该实现 IDisposable
    • 最初的问题是“除了包含一次性类型实例的类型应该实现 IDisposable 的规则之外,是否还有其他一般的经验法则来说明何时实现 IDispoable 是最佳实践”。跨度>
    • 此外,如果您有实现 IDispoable 的对象实例,那么您有需要释放的非托管资源,因此它属于我所说的规则。
    【解决方案3】:

    来自 MSDN:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

    使用此接口的 Dispose 方法与垃圾收集器一起显式释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。

    【讨论】:

      【解决方案4】:

      每当您分配必须释放的资源时,例如文件、句柄等。例如,如果您使用的是 Win32 资源(不实现 IDisposable),您应该实现 IDisposable 来释放它们。

      【讨论】:

        【解决方案5】:

        我通常在每次需要清理项目时实施 IDisposable。对我来说,这是在编写抽象数据库/网络/文件系统的代码时。

        它只是为垃圾收集器标记准备好的项目,而不是等待它自己尝试去做。

        【讨论】:

          【解决方案6】:

          IDisposable 是程序员对抗 .Net 内存泄漏的主要武器之一。虽然文档建议它应该用于外部资源,但我广泛使用 IDisposable 来释放 internal 资源,例如指向父类的指针。

          通过创建两个相互引用的类(即 foo 和 bar)来演示需求非常容易。 foo 指的是 bar,反之亦然。当 foo 超出范围时,GC 看到 bar 仍然引用它,因此它不会被收集(反之亦然)。内存没有被收集。

          这与 EventHandlers 表现出的问题相同,即在关闭表单时引用不会被释放,除非显式释放或实现 WeakEvent 模型。

          我建议最佳做法是假设一个 C++ 编程模型,您自己使用 Dispose 进行清理除非您确信 GC 可以为您解决。

          【讨论】:

            【解决方案7】:

            如果该类负责IDisposable-object 的生命周期,那么它应该实现IDisposable 接口并处理它(或使用using 语句)。这是因为如果你开始处理它们创建的单例,依赖注入容器会对你非常不满。

            【讨论】:

              猜你喜欢
              • 2013-08-22
              • 2014-07-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-26
              • 1970-01-01
              • 1970-01-01
              • 2011-02-09
              • 1970-01-01
              相关资源
              最近更新 更多