C# - 删除事件处理程序 - FormClosing事件或Dispose()方法

And*_*ndy 13 c# event-handling winforms

假设我有一个通过.ShowDialog()方法打开的表单.

在某些时候,我将一些事件处理程序附加到窗体上的某些控件.

例如

// Attach radio button event handlers.
this.rbLevel1.Click += new EventHandler(this.RadioButton_CheckedChanged);
this.rbLevel2.Click += new EventHandler(this.RadioButton_CheckedChanged);
this.rbLevel3.Click += new EventHandler(this.RadioButton_CheckedChanged);
Run Code Online (Sandbox Code Playgroud)

当表单关闭时,我需要删除这些处理程序,对吧?

目前,我在触发FormClosing事件时执行此操作.

例如

private void Foo_FormClosing(object sender, FormClosingEventArgs e)
{
    // Detach radio button event handlers.
    this.rbLevel1.Click -= new EventHandler(this.RadioButton_CheckedChanged);
    this.rbLevel2.Click -= new EventHandler(this.RadioButton_CheckedChanged);
    this.rbLevel3.Click -= new EventHandler(this.RadioButton_CheckedChanged);
}
Run Code Online (Sandbox Code Playgroud)

但是,我已经看到一些在Dispose()方法中删除处理程序的示例.

这样做有"最佳实践"方式吗?

(使用C#,Winforms,.NET 2.0)

谢谢.

Ben*_*n M 18

在这种情况下,您不需要删除处理程序,因为表单外部的代码都不会引用表单及其按钮,因此整个对象图将被垃圾回收.

  • 是的,因为表单已经处理好,所以它上面的所有控件都是,这意味着事件处理程序没有可能的链接?我一直以为如果我创造了一些东西,我也应该在它之后进行清理. (2认同)
  • 那就对了.如果你想要一个对象的集合,其中一个方法是另一个对象中的事件的目标,那么你必须删除处理程序.但是,在这种情况下,对象(表单+按钮)仅相互引用. (2认同)