在C#中正确处理用户控件和子控件

Joh*_*ohn 2 user-controls dispose design-patterns .net-2.0

我们遇到了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
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:1.为什么会这样?2.你们处理用户控件和儿童控件的最佳做法和经验是什么?例如,您是否始终取消订阅事件处理程序等.

谢谢!

Ore*_*ost 5

您不需要手动处理作为正在处理的控件的子控件的控件,即在Controls集合中.父控件将自动处理此问题.

如果您被处置,您必须取消订阅范围之外的事件,即那些将保持活着的对象的成员,因为它们将使您保持活着,尽管被处置.您不需要取消订阅正在处理的对象中的事件,例如您的子控件.