【发布时间】:2011-02-04 04:18:52
【问题描述】:
在以下类别中:
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);
如果它们有不同的效果,会是什么?
编辑:我问这个是因为,无论出于何种原因,第一种方法会在我的程序处理任何子程序之前冻结我的程序(disposing 是真的,Controls 包含2 个控件),而第二种方法可以正常工作。如果我能愉快地使用第二个,那就太好了。
【问题讨论】:
-
逻辑上是相同的,通常情况下,结果相同。 Clear() 调用将控制窗口移动到停放窗口。这个(线程)错误有一天会以另一种方式破坏你的后端。
-
@Joe:我很确定我们说的是同一件事。如果子面板仍在运行并生成事件,则很明显您正在泄漏事件处理程序。这并不意味着第二种方法更好,这意味着您需要正确管理您的对象。
-
@Cody,你是对的。我刚刚意识到,当我查看代码时,我正在做的是遍历我的演示者(按视图)并处理它们,从而处理事件处理程序。我不会处理视图上的每个按钮和文本框,那会很愚蠢,因此撤回了我的第一条评论。顺便说一句,我不是那个评论你的答案的乔,那是一个冒名顶替者!
标签: c# .net winforms controls dispose