Considere la situación en la que desea suscribirse a un evento para una y única notificación. Una vez que llega la primera notificación, se da de baja de todos los eventos futuros. ¿El siguiente patrón presentará algún problema de memoria? Funciona, pero no estaba seguro de si el cierre autorreferencial podría mantener las cosas en la memoria más tiempo de lo deseado.¿El siguiente patrón de cancelar su suscripción a un evento por cierre podría causar algún problema?
public class Entity
{
public event EventHandler NotifyEvent;
}
// And then, elsewhere, for a listen-once handler, we might do this:
Entity entity = new Entity();
Action<object, EventArgs> listener = null;
listener = (sender, args) =>
{
// do something interesting
// unsubscribe, so we only get 1 event notification
entity.NotifyEvent -= new EventHandler(listener);
};
entity.NotifyEvent += new EventHandler(listener);
Tenga en cuenta que usted tiene que declarar 'oyente' y asignar un valor (nulo). De lo contrario, el compilador se queja de 'Uso de la variable local no asignada listener
'
Es posible hacer que el código sea más expresiva encerrando la parte del código que empieza con 'Acción oyente = null;' llaves. Pero no estoy seguro de si esto haría la vida más fácil para el recolector de basura: ¡después de todo, de todos modos, ya no usa su variable! –
Vlad