tutorial metodos funciones expresiones ejemplos anonimos anonimas c# .net c#-3.0 event-handling lambda

c# - metodos - ¿Cómo darse de baja de un evento que usa una expresión lambda?



linq lambda c# (3)

Tengo el siguiente código para permitir que la GUI responda a un cambio en la colección.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

En primer lugar, ¿es esta una buena manera de hacer esto?

Segundo: ¿cuál es el código para darse de baja de este evento? ¿Es lo mismo pero con - = (y luego el método anónimo completo nuevamente)?


En primer lugar ... sí, es una buena forma de hacerlo, es limpio, de formato pequeño y fácil de leer y entender ... la advertencia, por supuesto, es "a menos que más tarde quieras darte de baja".

Creo que Jon Skeet señaló antes que "la especificación explícitamente no garantiza el comportamiento de ninguna manera cuando se trata de equivalencia de delegados creados con métodos anónimos".

Por lo tanto, si necesita darse de baja del evento más adelante, sería mejor que cree una instancia de delegado para que pueda conservar la referencia para más adelante.

var myDelegate = delegate(sender, e){UpdateMyUI()}; myObservableCollection.CollectionChanged += myDelegate; myObservableCollection.CollectionChanged -= myDelegate;


Es una buena forma de hacerlo, a menos que myObservableCollection vaya a vivir más tiempo que ''esto'', en cuyo caso podría terminar con una pérdida de memoria, ya que el delegado que se crea detrás de las escenas conservará una referencia a su ''esto'', que lo mantendrá vivo. Si está creando y ''destruyendo'' repetidamente lo que sea que esté escuchando el evento, descubrirá que no lo está recogiendo el recolector de basura.

Si esto es un problema, puede seguir la ruta sugerida en las respuestas, conservando una referencia al manejador, que debe crear primero.

Otra solución es usar referencias débiles para crear un controlador de eventos que permita que el suscriptor sea recolectado si no hay otras referencias. Exploré esta solución en esta pregunta y respuesta .


Si necesita darse de baja de un evento, necesita una referencia instanciada. Desafortunadamente, eso significa que no puedes usar esa sintaxis en particular.