4

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

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

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

匿名函数的准则是什么?框架会自动注销吗?如果有,什么时候?

4

2 回答 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;

另外,请参阅这个问题

于 2009-02-24T18:13:34.217 回答
2

如果我没记错的话(我记得我在哪里读到这个)内联匿名代表不能被删除。

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

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

myButton.Click += myhandler;
...
myButton.Click -= myHandler;
于 2009-02-24T18:13:52.843 回答