2009-07-29 11 views
13

Me preguntaba si el establecimiento de un objeto que será nula limpiar los manejadores de sucesos que se unen a los eventos objetos ...C# explícitamente Extracción de controladores de eventos

por ejemplo,

Button button = new Button(); 
button.Click += new EventHandler(Button_Click); 
button = null; 

button = new Button(); 
button.Click += new EventHandler(Button_Click); 
button = null; 

etc ...

¿Esta causar una pérdida de memoria?

Respuesta

16

Si no hay otras referencias a button en cualquier lugar, entonces no hay necesidad de quitar el controlador de eventos aquí para evitar una pérdida de memoria. Los manejadores de eventos son referencias unidireccionales, por lo que su eliminación solo es necesaria cuando el objeto con eventos es de larga duración y desea evitar que los manejadores (es decir, objetos con métodos de control) vivan más tiempo del que deberían. En tu ejemplo, este no es el caso.

+0

¿Significa esto que los controladores de eventos para barras de aplicación no necesitan eliminación explícita (cambio de estado, por ejemplo)? –

+0

Esta es una situación inversa. AppBar es un objeto de larga duración, y un controlador de eventos, como mínimo, mantendría vivo el objeto al que los delegados se refieren vivo mientras AppBar esté activo, y es posible que no desee que eso suceda. Por otro lado, si el controlador es un método en la ventana que posee la barra, no importa. –

8

Véase la discusión here under "The final question: do we have to remove event handlers?"

Conclusión: debe quitar delegados de eventos cuando llegan fuera de la clase en sí; es decir, cuando se suscribe a eventos externos, debe finalizar su suscripción cuando se hayan completado. De lo contrario, se mantendrá su objeto con vida más tiempo que necesario.

11

Resumen: Necesita anular la suscripción explícitamente cuando la fuente/el editor del evento es de larga duración y los suscriptores no. Si el origen del evento supera a los suscriptores, todos los suscriptores registrados se mantienen "vivos" por el origen del evento (no recopilados por el GC) a menos que cancelen su suscripción (y eliminen la referencia de ellos de la lista de notificaciones del editor del evento)

También este es un duplicado de Is it necessary to explicitly remove event handlers in C# y tiene un buen título n respuesta. Entonces votar para cerrar.

+0

Vi ese Q & A. Mi pregunta es mucho más directa y requiere una respuesta mucho más simple. – Damien

Cuestiones relacionadas