谁拥有控件?

时间:2013-03-01 21:54:23

标签: c# .net winforms idisposable

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

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窗体设计器生成代码以在Form的子代上调用Dispose的位置)

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

总是怀疑地来源:

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

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

好的...... FormContainerControl,所以:

ContainerControl.Dispose

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

Grrr * ...好的,ContainerControlControl

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);

是的;在表格上调用Dispose将处置其中包含的控件。