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