No estoy seguro si tengo completamente claro las implicaciones de adjuntar eventos a objetos.¿En qué casos es necesario desapegarse de los eventos?
Ésta es mi comprensión actual, correcta o elaborado:
1. Colocación de eventos de clase locales no tienen que ser separado
Ejemplos:
this.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
public event EventHandler OnMyCustomEvent = delegate { };
Supongo que cuando su ob ject se elimina o se recolecta basura, las funciones se desasignan y se separarían automáticamente de los eventos.
2. Colocación de objetos que ya no necesita (= null;) tienen que ser separado de
Ejemplos: Colocación en caso de transcurrido un temporizador, que sólo responde a una vez. Asumiría que necesita almacenar el temporizador en una variable local para poder separar el evento transcurrido después de que se desate el evento. Por lo tanto, se declara el temporizador en un ámbito método local al igual que daría lugar a una fuga:
System.Timers.Timer myDataTimer = new System.Timers.Timer(1000); myDataTimer.Elapsed += new System.Timers.ElapsedEventHandler(myDataTimer_Elapsed);
3. Colocación de eventos en un objeto local a su clase no requiere la eliminación?
Por ejemplo, si tiene un ObservableCollection que crea, supervisa y deja morir. Si adjuntó al evento CollectionChanged utilizando una función privada local, ¿esta función no se desasignaría cuando su clase se recolectara como basura, lo que ocasionaría que también se liberara la ObservableCollection?
Estoy seguro de que tengo lugares donde he dejado de usar objetos y no he podido separarme de un evento (por ejemplo, el ejemplo del temporizador que hice), entonces estoy buscando una explicación más clara de cómo funciona .
Tienes razón, estoy complicando las cosas. Al buscar ejemplos, casi todos mostraron desapego del evento, lo que solo me llevó a creer que el suscriptor podría mantener vivo al editor. –
Pregunta estúpida: ¿Eso implica que si el editor se suscribe a un evento en el suscriptor, ninguno de los dos puede/será recolectado? –
No, significa que hay una referencia circular: tan pronto como no haya * otras * referencias rooteadas a ninguna de ellas, ambas serán elegibles para GC. –