如何注销匿名处理程序?

发布于 2024-07-14 06:53:31 字数 359 浏览 7 评论 0原文

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

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

现在,假设 Button 是静态成员,然后向其添加委托将被视为非托管资源。 通常,我必须先取消注册该处理程序,然后才能再次对其进行重新字符串化。 这是 GUI 编程的一个非常常见的用例。

匿名函数的指导原则是什么? 框架会自动取消注册吗? 如果是的话,什么时候?

C# 2.0 has a neat feature called anonymous functions. This is intended to be used mostly with events:

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

Now, suppose that Button is a static member, then adding delegates to it would count as unmanaged resources. Normally, I would have to deregister the handler before regestring it again. This is a pretty common use case for GUI programming.

What are the guidelines with anonymous functions? Does the framework deregrister it automatically? If so, when?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

热血少△年 2024-07-21 06:53:31

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

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

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

Button.Click -= handler;

另外,请参阅此问题

No, anonymous functions will not get deregistered automatically. You should make sure to do it yourself, if the event should not be hooked up for the whole lifetime of your application.

To do this, of course, you would have to store the delegate reference, to be able to de-register it.
Something like:

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

Button.Click -= handler;

Also, see this question.

软的没边 2024-07-21 06:53:31

如果我没记错的话(并且我记得我在哪里读到过这篇文章)内联匿名委托不能被删除。

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

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

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

If I recall correctly (and I can recall where I read this) inline anonymous delegates cannot be removed.

You would need to assign to a (static) delegate field.

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

myButton.Click += myhandler;
...
myButton.Click -= myHandler;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文