ホームページ > バックエンド開発 > 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 式を使用してクリック イベントをサブスクライブするのは非常に簡単です。

<code class="language-csharp">button.Click += (s, e) => MessageBox.Show("Woho");</code>
ログイン後にコピー

しかし、このイベントを後で購読解除するにはどうすればよいでしょうか?

デリゲートを使用して購読を解除します

C# 仕様では、ラムダ式と匿名デリゲートが常に同じデリゲートを生成するとは限りません。したがって、信頼性の高いサブスクリプション解除を保証するために、使用されたデリゲート インスタンスを明示的に追跡できます。

<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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート