使用Dispose()从Form中删除Control

时间:2015-10-29 08:02:40

标签: c# garbage-collection dispose

使用Dispose()从表单中删除Control是否正确?

E.g。我有一个按钮'按钮1'在我的公式上。当调用Dispose()时,它会立即从表单中消失,也会从表单的“控件”中删除。但情况总是这样吗?或者是否有其他情况(可能是其他控件)GC会等待一段时间?

3 个答案:

答案 0 :(得分:3)

这个"奖金" Control.Dispose没有记录。

作为一般性提示,您不应围绕未来的未记录行为保持不变的预期或甚至在所有当前控制实现中保持您的程序。

但是,正如您从Reference Source of Control.Dispose(bool)

中看到的那样
if (parent != null) {
    parent.Controls.Remove(this);
}

这确实发生在当前的实施中。

但同样,这不是记录在案的行为。按照你的意愿做好准备。

答案 1 :(得分:2)

来自MSDN

  

此方法由公共Dispose方法和Finalize调用   方法。 Dispose调用受保护的Dispose(Boolean)方法   将参数设置为true。 Finalize调用Dispose with   将set设置为false。

所以我觉得没问题。

答案 2 :(得分:0)

你应该调用Dispose()吗?

每当你看到任何实现System.IDisposable的类时,你应该假设该类的设计者认为该类可能拥有一些稀缺的资源。

您没有义务调用这些类的对象的Dispose()。如果你不这样做,终结者将会。但是,如果您不调用Dispose(),则稀缺资源的保留时间将超过所需资源,可能会导致资源不足。

的确,在为控件赋值null之前,你应该调用Control.Dispose()。

在处置控件之前是否应从控件集合中删除控件?

显然,当前的实现确保从control.Parent.Controls中的控件集合中删除已处理的控件。

但是,根据您的实现,您确定添加控件的ControlCollection不是System.Windows.Forms.Control.ControlCollection的子类,行为略有不同吗?毕竟:ControlCollection没有密封。即使您使用自己的ControlCollection创建自己的表单,人们也可能使用自己的ControlCollection从您的表单派生。

因此,为了确保你遵守处理ControlCollection的规则,我认为你应该在处理之前从集合中删除控件。

// Create myControl and add to myForm
var myControl = new MyControl(...);
myControl.SetProperties
myForm.Controls.Add(myControl);

// proper removal:
// if someone else could already have removed the control:
// add a check if it is still there.
myForm.Control.Remove(myControl);
myControl.Dispose();    // no problem if already disposed
myControl = null;