2009-08-27 18 views
10

Desde el Diseñador en VS, digamos que hace doble clic en un botón y genera este controlador de eventos Click.¿Debo anular la suscripción a todos los controladores de eventos?

el código de suscripción está en designer.cs.

Me preguntaba, en el formulario, ¿DEBO desinscribir el evento?

Además, todos los controles que están en el formulario ¿se eliminarán cuando los formularios dispongan? en realidad, ¿desear disponer de cada control recursivamente?

Respuesta

15

No necesita desenganchar el evento en Dispose si está enganchando su propio evento.

Solo tiene que preocuparse si está enganchando un evento en otro objeto. La razón de esto es que los ganchos de evento mantienen viva una referencia para el suscriptor. Si no logras desenganchar, no obtendrás basura recolectada mientras el observable esté vivo.

Cuando engancha su propio evento, tiene una referencia a usted mismo, que es circular, por lo tanto, no tiene que preocuparse por ello.

He venido para apoyar patrones de eventos más flojos por este motivo. Este es el lugar # 1 para fugas de memoria en .Net. Prefiero el patrón Event Aggregator (con weak events).

+0

Gracias por la gran explicación. Tiene perfecto sentido para no desengancharse cuando te estás enganchando. – pdiddy

1

Mientras el código de controlador de eventos es la forma en sí, entonces no habría necesidad de darse de baja de los eventos - ya que no habría un controlador de eventos que colgaba a los controles como la forma en sí sería destruido

2

En la pregunta "¿realmente va a llamar a disponer de cada control recursivamente?", La respuesta es sí.

Se puede realizar una prueba simple colocando un punto de interrupción en el método Dispose de un control.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Controls.Add(new SuperButton()); 
    } 
} 

public class SuperButton : Button 
{ 
    protected override void Dispose(bool disposing) 
    { 
     //Place breakpoint on the line below 
     base.Dispose(disposing); 
    } 
} 
Cuestiones relacionadas