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

Bog*_*SFT 4 .net c# events anonymous-methods

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

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

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

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

dri*_*iis 9

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

当然,要执行此操作,您必须存储委托引用,以便能够取消注册它.就像是:

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

Button.Click -= handler;
Run Code Online (Sandbox Code Playgroud)

另外,请看这个问题.