C#2.0有一个称为匿名函数的简洁功能。这主要用于事件:
Button.Click += delegate(System.Object o, System.EventArgs e)
{ System.Windows.Forms.MessageBox.Show("Click!"); };
现在,假设Button是一个静态成员,那么向其添加委托将被视为非托管资源。通常,我必须在再次对其进行regestring之前取消注册该处理程序。这是GUI编程的一个非常常见的用例。
匿名功能有哪些指导原则?框架是否自动取消注册?如果是的话,何时?
答案 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;