gpt4 book ai didi

c# - 处置面板相当于处置其子项加上自身吗?

转载 作者:行者123 更新时间:2023-12-02 05:19:46 24 4
gpt4 key购买 nike

在以下类中:

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 documentationControl.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拥有PanelForm时,Panel控件及其所有子控件都将被释放自动为您服务。没有理由对 Panel 控件显式执行此操作,除非您动态地在表单中添加和删除实例。

关于c# - 处置面板相当于处置其子项加上自身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com