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

时间:2010-05-02 17:47:32

标签: c# winforms event-handling

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

在某些时候,我会将一些事件处理程序附加到表单上的某些控件上。

e.g。

// 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);

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

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

e.g。

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);
}

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

这样做有“最佳实践”方法吗?

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

感谢。

2 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:3)

不,您不需要从正在关闭的表单上的控件中删除事件处理程序。他们将全部放在一起。

您可能正在考虑需要删除事件处理程序的网页,以避免浏览器中的内存泄漏。