如何注销匿名处理程序?

4

C# 2.0有一个很棒的功能叫做匿名函数。这主要用于事件:

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

假设 Button 是一个静态成员,那么向其添加委托将被视为非托管资源。通常情况下,我需要在重新注册处理程序之前取消注册它。这是 GUI 编程的一个非常常见的用例。

对于匿名函数,有什么指导方针吗?框架会自动取消注册它吗?如果是这样,何时取消注册?

2个回答

9
不会自动注销匿名函数。如果事件不应该在应用程序的整个生命周期中连接,您应该确保自己注销它。当然,要做到这一点,您需要存储委托引用以便能够注销它。可以像这样处理:
EventHandler handler = delegate(System.Object o, System.EventArgs e)
               { System.Windows.Forms.MessageBox.Show("Click!"); };
Button.Click += handler;
// ... program code

Button.Click -= handler;

另外,参见这个问题


哈哈,这个之前被问过了。我使用了“注销”而不是“取消订阅”,所以没有出现。 - Bogdan Gavril MSFT

2

如果我没记错的话(我还记得我在哪里读到的),内联匿名委托不能被移除。

你需要将其分配给一个(静态)委托字段。

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

myButton.Click += myhandler;
...
myButton.Click -= myHandler;

它不需要是一个类成员,它可以在同一个方法内。 - Bogdan Gavril MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接