首頁 >後端開發 >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