5

假设我有一些这样的组件:

class SomeForm : Form
{
    private Control example;

    public void Stuff()
    {
        this.example = new ComboBox();
        // ...
        this.Controls.Add(example);
    }

    public void OtherStuff()
    {
        this.Controls.Remove(example);
    }
}

谁负责调用Dispose示例控件?删除它this.Controls会导致它被处置吗?或者这是否会泄漏支持控件的窗口句柄?

(作为参考,我问这个是因为我看不到 Windows 窗体设计器在哪里生成代码来调用窗体的子级上的 Dispose)

4

3 回答 3

5

Form.Dispose()将处理Controls集合中的控件。因此,从中删除控件Controls将需要您自己处理控件。

于 2013-03-01T21:58:12.573 回答
3

释放包含此控件的表单时,将释放存储在 Controls 属性中的所有控件。您不需要从集合中删除您的自定义控件。只需确保已处理包含表单。

如果您从集合中删除该控件,则该控件最终将超出范围并且无法进行垃圾回收。当 GC 运行时,它将调用终结器/析构函数,在 Form 类的情况下,它将简单地调用 Dispose 方法。话虽这么说,依赖它是不好的做法。您应该始终确保在完成使用 IDisposable 接口的类上确定性地(手动)调用 Dispose 方法。

于 2013-03-01T21:56:40.287 回答
0

总是去怀疑的源头:

Form.Dispose看起来有点像这样:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
       ... lots and lots of weird optimized checks ...
       base.Dispose(disposing);

好的......Form是一个ContainerControl,所以:

ContainerControl.Dispose

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this.activeControl = null;
    }
    base.Dispose(disposing);
    this.focusedControl = null;
    this.unvalidatedControl = null;
}

Grrr* ...好吧,ContainerControl是一个Control

Control.Dispose

protected override void Dispose(bool disposing)
{
    ... a whole lot of resource reclaiming/funky code ...
     ControlCollection controls = (ControlCollection) 
            this.Properties.GetObject(PropControlsCollection);
     if (controls != null)
     {
         for (int i = 0; i < controls.Count; i++)
         {
              Control control = controls[i];
              control.parent = null;
              control.Dispose();
         }
         this.Properties.SetObject(PropControlsCollection, null);
      }
      base.Dispose(disposing);

所以是的;调用DisposeForm 将释放其中包含的控件。

于 2013-03-01T22:05:42.237 回答