在以下类中:
class MyPanel : Panel
{
...
protected override void Dispose(bool disposing)
{
// My code here
}
}
以下两个代码示例等效吗?
base.Dispose(disposing);
对比
if (disposing)
{
List<Control> ctrls = new List<Control>(this.Controls);
this.Controls.Clear();
foreach(Control c in ctrls)
{
c.Dispose();
}
}
base.Dispose(disposing);
如果它们有不同的效果,会是什么?
编辑:我问这个是因为,无论出于何种原因,第一种方法会在处理其任何子项之前卡住我的程序(处理
是正确的,和 Controls
包含 2 个控件),而第二种方法效果很好。如果我能愉快地使用第二个,那就太好了。
最佳答案
是的,处置容器将自动处置其子控件。
根据MSDN documentation ,Control.Dispose
方法:
Releases the unmanaged resources used by the Control and its child controls and optionally releases the managed resources.
因此,在 Panel
控件上调用 Dispose
方法将自动释放其子控件。然而,正如 Joe 的评论所指出的,对此有一个重要的警告:子控件必须取消订阅在父级范围之外声明的事件。如果事件是保持事件状态的对象的成员,它们也会使子控件保持事件状态并阻止它们被正确处置。显然,您不需要取消订阅同时处理的对象(例如父对象)中声明的事件。
当然,这也没有什么值(value),因为它可以扩展到 Panel
控件的容器(很可能是 Form
控件)。每当您Dispose
拥有Panel
的Form
时,Panel
控件及其所有子控件都将被释放自动为您服务。没有理由对 Panel
控件显式执行此操作,除非您动态地在表单中添加和删除实例。
关于c# - 处置面板相当于处置其子项加上自身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894517/