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

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

Barbara Streisand
Barbara Streisand原创
2025-01-20 09:46:09693浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn