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

标签 c# .net winforms controls dispose

在以下类中:

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/

相关文章:

c# - 在同一线程中类的所有实例之间共享类的数据成员

.net - WCF 是否具有与 MVC 的 [Authorize] 属性等效的属性?

c# - 什么规则管理 .NET 应用程序和 C# 语言的跨版本兼容性?

winforms - TreeView 在 Ctrl+Click 上重新获取焦点

c# - 找不到静态图像的 Controller 路径? asp.net mvc 路由问题?

C#:检查 XML 中的重复元素

c# - 覆盖 .NET RichTextBox 上的快捷键

c#线程和显示更新

c# - 无法获取此查询的架构 Visual Studio 2015

.net - 为什么 Dictionary<TKey, TValue> 没有 IEnumerable<KeyValuePair<TKey, TValue>> ctor?