假设我有一些这样的组件:
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的位置)
答案 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);
好的...... 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);
是的;在表格上调用Dispose
将处置其中包含的控件。