Maison >développement back-end >C++ >Comment se désabonner des gestionnaires d'événements Lambda en C# ?

Comment se désabonner des gestionnaires d'événements Lambda en C# ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-20 09:46:09743parcourir

How to Unsubscribe from Lambda Event Handlers in C#?

Supprimer le gestionnaire d'événements Lambda en C#

En C#, les expressions Lambda fournissent un moyen concis de définir des gestionnaires d'événements simples. Par exemple, s'abonner à un événement de clic à l'aide d'une expression Lambda est très simple :

<code class="language-csharp">button.Click += (s, e) => MessageBox.Show("Woho");</code>

Mais comment puis-je me désinscrire ultérieurement de cet événement ?

Utilisez un délégué pour vous désabonner

La spécification C# indique que les expressions Lambda et les délégués anonymes ne génèrent pas toujours le même délégué. Par conséquent, pour garantir un désabonnement fiable, vous pouvez suivre explicitement l'instance de délégué utilisée :

<code class="language-csharp">EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
...
button.Click -= handler;</code>

Utiliser des méthodes indépendantes

Si vous ne souhaitez pas utiliser de délégué, vous pouvez définir une méthode distincte pour le gestionnaire d'événements :

<code class="language-csharp">public void ShowWoho(object sender, EventArgs e)
{
     MessageBox.Show("Woho");
}

...

button.Click += ShowWoho;
...
button.Click -= ShowWoho;</code>

Gestionnaire Lambda auto-supprimant

Si vous souhaitez utiliser une expression Lambda pour créer un gestionnaire d'événements auto-supprimant, vous pouvez référencer le délégué dans l'expression Lambda. Cependant, vous devez d'abord affecter la variable à null :

<code class="language-csharp">EventHandler handler = null;
handler = (sender, args) =>
{
    button.Click -= handler; // 取消订阅
    // 在此处添加您的单次执行代码
};
button.Click += handler;</code>

Utiliser la classe déléguée pour l'encapsulation

Il est possible d'encapsuler la fonctionnalité d'auto-suppression dans une classe de délégué, mais cela peut être plus compliqué en raison de la nature abstraite de l'événement :

<code class="language-csharp">button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) =>
{
    // 此处的单次执行代码
}, handler => button.Click -= handler);</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn