225 votes

Comment supprimer un gestionnaire d'événement lambda

Duplicatas possibles :
Méthode anonyme de désabonnement en C#
Comment désenregistrer le gestionnaire d'événement "anonyme" ?

J'ai récemment découvert que je pouvais utiliser des lambdas pour créer de simples gestionnaires d'événements. Je pourrais par exemple m'abonner à un événement de clic comme ceci :

button.Click += (s, e) => MessageBox.Show("Woho");

Mais comment le désabonner ?

322voto

Jon Skeet Points 692016

La spécification C# indique explicitement (IIRC) que si vous avez deux fonctions anonymes (méthodes anonymes ou expressions lambda), il peut ou non créer des délégués égaux à partir de ce code. (Deux délégués sont égaux s'ils ont des cibles égales et font référence aux mêmes méthodes).

Pour être sûr, vous devez vous souvenir de l'instance de délégué que vous avez utilisée :

EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
...
button.Click -= handler;

(Je ne peux pas trouver la partie pertinente de la spécification, mais je serais assez surpris de voir le compilateur C# essayer agressivement de créer des délégués égaux. Il serait certainement peu judicieux de s'y fier).

Si vous ne voulez pas faire cela, vous devrez extraire une méthode :

public void ShowWoho(object sender, EventArgs e)
{
     MessageBox.Show("Woho");
}

...

button.Click += ShowWoho;
...
button.Click -= ShowWoho;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X