Heim >Backend-Entwicklung >C++ >Wie kann ich mich von Lambda-Ereignishandlern in C# abmelden?
Lambda-Ereignishandler in C# entfernen
In C# bieten Lambda-Ausdrücke eine übersichtliche Möglichkeit, einfache Ereignishandler zu definieren. Das Abonnieren eines Klickereignisses mithilfe eines Lambda-Ausdrucks ist beispielsweise sehr einfach:
<code class="language-csharp">button.Click += (s, e) => MessageBox.Show("Woho");</code>
Aber wie kann ich mich nachträglich von dieser Veranstaltung abmelden?
Verwenden Sie Delegat, um sich abzumelden
Die C#-Spezifikation besagt, dass Lambda-Ausdrücke und anonyme Delegaten nicht immer denselben Delegaten generieren. Um eine zuverlässige Abmeldung zu gewährleisten, können Sie daher die verwendete Delegate-Instanz explizit verfolgen:
<code class="language-csharp">EventHandler handler = (s, e) => MessageBox.Show("Woho"); button.Click += handler; ... button.Click -= handler;</code>
Verwenden Sie unabhängige Methoden
Wenn Sie keinen Delegaten verwenden möchten, können Sie eine separate Methode für den Ereignishandler definieren:
<code class="language-csharp">public void ShowWoho(object sender, EventArgs e) { MessageBox.Show("Woho"); } ... button.Click += ShowWoho; ... button.Click -= ShowWoho;</code>
Selbstentfernender Lambda-Handler
Wenn Sie einen Lambda-Ausdruck verwenden möchten, um einen selbstentfernenden Ereignishandler zu erstellen, können Sie im Lambda-Ausdruck auf den Delegaten verweisen. Allerdings müssen Sie der Variablen zunächst null zuweisen:
<code class="language-csharp">EventHandler handler = null; handler = (sender, args) => { button.Click -= handler; // 取消订阅 // 在此处添加您的单次执行代码 }; button.Click += handler;</code>
Verwenden Sie die Delegate-Klasse zur Kapselung
Es ist möglich, Selbstentfernungsfunktionen in einer Delegate-Klasse zu kapseln, dies kann jedoch aufgrund der abstrakten Natur des Ereignisses komplizierter sein:
<code class="language-csharp">button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) => { // 此处的单次执行代码 }, handler => button.Click -= handler);</code>
Das obige ist der detaillierte Inhalt vonWie kann ich mich von Lambda-Ereignishandlern in C# abmelden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!