quitar net eventos evento ejemplo delegados crear c# events event-handling lambda

net - eventos y delegados c#



Cómo eliminar un controlador de eventos lambda (1)

La especificación de C # establece explícitamente (IIRC) que si tiene dos funciones anónimas (métodos anónimos o expresiones lambda) puede o no crear delegados iguales a partir de ese código. (Dos delegados son iguales si tienen objetivos iguales y se refieren a los mismos métodos).

Para estar seguro, debe recordar la instancia de delegado que utilizó:

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

(No puedo encontrar la parte relevante de la especificación, pero me sorprendería ver que el compilador de C # intente agresivamente crear delegados iguales. Sin duda, sería imprudente confiar en ello).

Si no quieres hacer eso, necesitarás extraer un método:

public void ShowWoho(object sender, EventArgs e) { MessageBox.Show("Woho"); } ... button.Click += ShowWoho; ... button.Click -= ShowWoho;

Si desea crear un controlador de eventos que se elimine utilizando una expresión lambda, es un poco más complicado: debe referirse al delegado dentro de la expresión lambda, y no puede hacerlo con un simple "declarar una variable local y asignar utilizando una expresión lambda "porque entonces la variable no se asigna definitivamente. Por lo general, evita esto asignando un valor nulo a la variable primero:

EventHandler handler = null; handler = (sender, args) => { button.Click -= handler; // Unsubscribe // Add your one-time-only code here } button.Click += handler;

Desafortunadamente, ni siquiera es fácil encapsular esto en un método, porque los eventos no están representados de manera clara. Lo más cerca que podrías venir sería algo como:

button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) => { // One-time code here }, handler => button.Click -= handler);

Incluso eso sería difícil de implementar dentro de los Delegates.AutoUnsubscribe porque tendría que crear un nuevo EventHandler (que sería solo un argumento de tipo genérico). Se puede hacer, pero desordenado.

Posibles duplicados:
Anular la suscripción del método anónimo en C #
Cómo desregistro el controlador de eventos ''anónimo''

Recientemente descubrí que puedo usar lambdas para crear controladores de eventos simples. Podría, por ejemplo, suscribirme a un evento de clic como este:

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

Pero, ¿cómo anular la suscripción?