Digamos que tengo una clase A, que puede disparar un evento llamado X. Ahora tengo una clase B y en un método consigo una instancia de A y ato el caso de un controlador en B:¿Cómo deshacerse de los controladores de eventos de forma segura?
public void BindEvent(A a)
{
a.X += AEventHandler;
}
Tengo tres preguntas sobre esto.
¿Es cierto que cuando ahora me puse la referencia a la instancia B en null, no será recolectado desde el recolector de basura piensa que todavía está en uso (manteniendo así un inútil y potencialmente interferir copia de B en la memoria).
¿Qué sucede cuando tengo otro objeto c (de clase C) en el que tengo una referencia a A llamado a ("this.a = new A()"). Luego llamo "b.BindEvent (this.a)", y en c establezco la referencia a a a null ("this.a = null"). ¿Esto mantendrá la copia de A en la memoria porque se hace referencia a través del evento en b?
Si alguno o ambos son ciertos de lo anterior, ¿cómo puedo evitar estos problemas? Si tengo una lista completa de manejadores de eventos (digamos 10 líneas como "a.SomeEvent + = SomeMethod") debería limpiarlos de nuevo ("a.SomeEvent - = SomeMethod"). ¿En qué momento o lugar en el código debería hacer estas cosas?
Bueno, se ha vuelto un poco borroso, pero no estoy seguro de cómo explicarlo de una mejor manera. Deje un comentario si necesito explicar algo más detallado.
Estoy bastante seguro de que 2 es incorrecto. En primer lugar, el evento * never * mantiene vivo al editor ('A') y, en segundo lugar, nada puede ver' A' de todos modos ... por lo que los datos se desconectan y se recopilan. –
Doh! Estoy corregido. :-) –