【问题标题】:Why not Dispose always?为什么不总是 Dispose?
【发布时间】:2012-09-05 13:18:42
【问题描述】:

我知道已经有人问过这个问题,但我的问题比我见过的其他问题更笼统。

当我在程序中检查我对Forms 中控件的使用以及DB(命令、阅读器等)的命令时,我想到了以下问题:

如果我有一个控件,我不应该在使用后Dispose它吗?

这样我将确保我的程序只使用所需的资源,如果我必须使用已经释放的控件,那么我将再次加载它。

也许有理由不总是处理所有东西,但这就是我问这个问题的原因。

感谢您的任何回答,我希望我说清楚了。

【问题讨论】:

  • 您甚至没有提及或标记您正在谈论的语言。我猜是 C#?
  • 是的 C#。我添加了标签。谢谢
  • " 如果我​​必须使用已处理的控件“哦,但如果您以后必须使用,您就不会处理掉某些东西,对吧?
  • 你有“某种控制权”。你能澄清一下吗?控件生命周期大部分时间正是所有者窗口的生命周期,因为它适合组件集合模式。 “使用后”?你如何使用你的控制?为了回答,请在使用结束时处理您创建的对象。

标签: c# dispose


【解决方案1】:

您创建的非可视化组件(命令、读取器、I/O 组件,基本上是任何实现 IDisposable 的组件)都应该在您完成它们之后被释放。

对于可视化控件,FormDispose 函数应该自动处理其 Controls 集合中的所有控件,因此您只需担心从表单的 Controls 中删除的某些控件原因。

除非您遇到严重的内存问题,否则尝试手动处理表单控件可能是一种微优化。

【讨论】:

    【解决方案2】:

    是的,如果没有具体的理由反对它,您可能应该处置所有东西。当 FormForm 被释放时,控件会自动释放。

    不释放 UI 资源并不是很有害。只是比必要的系统资源使用多一点内存。在大多数情况下,这不是功能问题。

    当然,这与数据库连接和文件相反!处置它们至关重要。

    【讨论】:

    • 如果处理很关键,那么有些东西就坏了。应该总是有可能(并且,对于这个词的某些价值,“安全”)不处置。
    • @cHao 我不认为这是真的:想想文件被锁定的时间不确定,因为 FileStream 没有被释放。或者事务泄漏到下一个 HTTP 请求中,因为它没有在上一个请求中结束。这两个例子都是稳定性的永久性问题。它们会导致随机行为。它们是必须修复的
    • 这两个例子都是其他的破碎。如果您需要一个文件立即可用,您关闭它。如果您不希望该事务在下一个请求中处于活动状态,则回滚或提交它。两者都是滥用Dispose 做不应该做的事情的例子。它有一项工作,并且该工作不会为您回滚您的交易。 这应该已经完成​​了,如果你正在使用该死的交易的话。
    【解决方案3】:

    如果您使用的是非托管资源,那么可以。继续执行IDisposable,使用using 将简化您的工作。但并非总是如此,至于你的问题。您的控件(UI 控件)已经实现了此 IDisposable,并且在关闭时将由其父级调用。

    【讨论】:

      【解决方案4】:

      是的,你应该这样做。在 Windows 窗体窗口(或容器内)中,窗体设计器会为您完成:

      protected override void Dispose(bool disposing)
      {
          if(disposing && (components != null))
          {
              components.Dispose();
          }
          base.Dispose(disposing);
      }
      

      【讨论】:

        猜你喜欢
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        相关资源
        最近更新 更多