La especificación C# declara explícitamente (IIRC) que si tiene dos funciones anónimas (métodos anónimos o expresiones lambda) puede crear o no delegados iguales desde ese código. (Dos delegados son iguales si tienen objetivos iguales y se refieren a los mismos métodos.)
Para estar seguros, que había necesidad de recordar el ejemplo que utilizó delegado:
EventHandler handler = (s, e) => MessageBox.Show("Woho");
button.Click += handler;
...
button.Click -= handler;
(no puedo encuentre el bit relevante de la especificación, pero me sorprendería bastante ver que el compilador de C# intenta agresivamente crear delegados iguales. Sin duda sería imprudente confiar en ello.)
Si no quiere 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: necesita referirse al delegado dentro de la expresión lambda, y no puede hacer eso con un simple "declare a local variable y asignarle usando una expresión lambda "porque entonces la variable no está definitivamente asignada. Por lo general, evitar esto mediante la asignación de un valor nulo a la primera variable:
EventHandler handler = null;
handler = (sender, args) =>
{
button.Click -= handler; // Unsubscribe
// Add your one-time-only code here
}
button.Click += handler;
Por desgracia, no es fácil, incluso para encapsular esto en un método, porque los acontecimientos no están representados limpiamente. Lo más cerca que podría venir sería algo así como:
button.Click += Delegates.AutoUnsubscribe<EventHandler>((sender, args) =>
{
// One-time code here
}, handler => button.Click -= handler);
Incluso eso sería difícil de poner en práctica dentro de Delegates.AutoUnsubscribe
porque habría que crear una nueva EventHandler
(que sería sólo un argumento de tipo genérico). Doable, pero desordenado.
Vea aquí: http://stackoverflow.com/questions/183367 –
¿Ha probado el operador - =? – Maciek
@Svish: una lambda es esencialmente un método anónimo. – dtb