首页 > 后端开发 > C++ > 如何在 C# 中取消订阅 Lambda 事件处理程序?

如何在 C# 中取消订阅 Lambda 事件处理程序?

Barbara Streisand
发布: 2025-01-20 09:46:09
原创
692 人浏览过

How to Unsubscribe from Lambda Event Handlers in C#?

移除C#中的Lambda事件处理程序

在C#中,Lambda表达式提供了一种简洁的方式来定义简单的事件处理程序。例如,使用Lambda表达式订阅点击事件非常简单:

<code class="language-csharp">button.Click += (s, e) => MessageBox.Show("Woho");</code>
登录后复制

但是,如何随后取消订阅此事件呢?

使用委托取消订阅

C#规范指出,Lambda表达式和匿名委托并不总是生成相同的委托。因此,为了确保可靠地取消订阅,您可以显式跟踪使用的委托实例:

<code class="language-csharp">EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
...
button.Click -= handler;</code>
登录后复制

使用独立方法

如果您不想使用委托,可以为事件处理程序定义一个单独的方法:

<code class="language-csharp">public void ShowWoho(object sender, EventArgs e)
{
     MessageBox.Show("Woho");
}

...

button.Click += ShowWoho;
...
button.Click -= ShowWoho;</code>
登录后复制

自移除Lambda处理程序

如果您希望使用Lambda表达式创建一个自移除的事件处理程序,可以在Lambda表达式中引用委托。但是,您必须首先将变量赋值为null:

<code class="language-csharp">EventHandler handler = null;
handler = (sender, args) =>
{
    button.Click -= handler; // 取消订阅
    // 在此处添加您的单次执行代码
};
button.Click += handler;</code>
登录后复制

使用委托类进行封装

可以将自移除功能封装到委托类中,但这可能由于事件的抽象性质而更加复杂:

<code class="language-csharp">button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) =>
{
    // 此处的单次执行代码
}, handler => button.Click -= handler);</code>
登录后复制

以上是如何在 C# 中取消订阅 Lambda 事件处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板