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!