明确的控制措施不会处置它们 - 风险是什么?

ser*_*hio 8 .net components garbage-collection dispose clear

有多个线程(a,b,c等)关于.NET组件容器中的Clear()项不会处理它们(通过调用Dispose(true))这一事实.

最常见的是,恕我直言,Clear-ed组件在应用程序中不再使用,因此在从父容器中清除它们之后需要明确地进行处理.

也许这是一个好主意,集合的Clear方法有一个bool参数dispose,当在true时也会在从列表中删除之前处理​​集合元素?

Han*_*ant 15

要求进行这样的修改毫无意义,Windows Forms团队已经解散了很久以前.它处于维护模式,仅考虑安全问题和操作系统不兼容性.

否则很简单就可以创建自己的方法来执行此操作:

  public static class ExtensionMethods {
    public static void Clear(this Control.ControlCollection controls, bool dispose) {
      for (int ix = controls.Count - 1; ix >= 0; --ix) {
        if (dispose) controls[ix].Dispose();
        else controls.RemoveAt(ix);
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

现在你可以写:

  panel1.Controls.Clear(true);
Run Code Online (Sandbox Code Playgroud)

  • 当然,你会泄漏控件.其他线程不是很明显吗? (2认同)
  • 呃,我没有这么说.事实上,我认为Clear()一般都没有多大意义.WF经过优化,可以使用UserControls和设计器.容器控件已经知道如何正确处理它们的子控件. (2认同)
  • 处置控件会自动在其Controls集合中处理任何子控件.无需帮助. (2认同)