【问题标题】:Does Form.Dispose() call controls inside's Dispose()?Form.Dispose() 是否调用 Dispose() 内部的控件?
【发布时间】:2010-09-08 18:57:32
【问题描述】:

当我创建表单时,自动生成的代码不包含被覆盖的 Dispose 方法。这是否意味着没有为表单中的所有控件调用 Dispose?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    当您在表单上调用Dispose 时,它将为其Controls 集合中的每个控件调用Dispose。这些控件将依次执行相同的操作,因此最终应该调用所有控件的Dispose 方法。请注意,这不是基于控件是否存在于设计器中;它基于在完成对 Dispose 的调用时在表单的 Controls 集合中找到的控件实例。

    我可以看到这不会发生的唯一情况是,如果您自己创建一些容器控件并覆盖 Dispose 而不将调用传播到基类或迭代包含的控件并在它们上调用 Dispose .

    【讨论】:

    • 是的。组件以不同的方式完成,这就是自动生成的 Dispose() 方法所负责的。从 Controls 集合中删除控件而不释放它是一种很好的泄漏方式。
    【解决方案2】:

    应该的。您可能需要查看 YourForm.designer.cs 文件。它看起来像这样:

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

    base.Dispose(); 调用将负责清理添加到表单的控件。

    【讨论】:

    • 这并不完全正确; components 字段为 null,除非表单上有非 UI 组件(例如 TimerHelpProviderBackgroundWorker)。 components 处理处置这些组件。它在按钮、文本框等其他控件上调用 dispose。
    • 没错,表单的控件实际上是通过对base.Dispose()的调用,即在Control.Dispose()内部进行的。当您使用 Reflector 查看 Form.Dispose() 时,实际上还有很多清理工作要做。
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2023-03-22
    • 2010-12-14
    • 2017-02-10
    • 2013-10-31
    相关资源
    最近更新 更多