我们遇到了IDisposable模式的一些问题。在这种情况下,有一个用户控件'ControlA'带有一个FlowLayoutPanel,它包含更多用户控件'ControlB'。
当调用Dispose(bool)时,我检查是否处置为true,如果IsDisposed为false。然后我尝试在FlowLayoutPanel的Controls集合中显式地处理每个ControlB。 但是,如果不循环遍历所有控件,则只有8个中的3个或4个中的2个。
Dispose(bool disposing)
{
if (disposing)
{
if (!IsDisposed)
{
//unhook events etc.
foreach(ControlB ctrl in flowlayoutpanel.Controls) //<-- there 8 controls
ctrl.Dispose(); //<-- called 3 times only
flp.Controls.Clear();
}
}
//make all members null
}
我的问题是:1。为什么会这样? 2.你们处理用户控件和儿童控件的最佳做法和经验是什么?例如。你是否一直取消订阅事件处理程序等等。
谢谢!
答案 0 :(得分:5)
您不需要手动处理作为正在处理的控件的子控件的控件,即在Controls集合中。父控件将自动处理。
如果您被处置,您必须取消订阅您的范围之外的事件,即那些将保持活着的对象的成员,因为它们将使您保持活着,尽管被处置。您不需要取消订阅正在处理的对象中的事件,例如您的子控件。