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