如何取消注册匿名处理程序?

时间:2009-02-24 18:07:54

标签: c# .net events anonymous-methods

C#2.0有一个称为匿名函数的简洁功能。这主要用于事件:

Button.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("Click!"); };

现在,假设Button是一个静态成员,那么向其添加委托将被视为非托管资源。通常,我必须在再次对其进行regestring之前取消注册该处理程序。这是GUI编程的一个非常常见的用例。

匿名功能有哪些指导原则?框架是否自动取消注册?如果是的话,何时?

2 个答案:

答案 0 :(得分:9)

不,匿名函数不会自动取消注册。如果事件不应在应用程序的整个生命周期内连接,您应该确保自己完成。

要做到这一点,当然,您必须存储委托引用,以便能够取消注册它。 类似的东西:

EventHandler handler = delegate(System.Object o, System.EventArgs e)
               { System.Windows.Forms.MessageBox.Show("Click!"); };
Button.Click += handler;
// ... program code

Button.Click -= handler;

另请参阅this question

答案 1 :(得分:2)

如果我没记错(我记得在哪里读到这篇文章)内联匿名代表无法删除。

您需要分配到(静态)委托字段。

private static EventHandler<EventArgs> myHandler = (a,b) => { ... }

myButton.Click += myhandler;
...
myButton.Click -= myHandler;
相关问题