2009-08-27 18 views
10

Dal Designer in VS diciamo che fai doppio clic su un pulsante e genera questo gestore di eventi Click.Devo annullare l'iscrizione a tutti i gestori di eventi?

il codice di abbonamento è nel designer.cs.

Mi chiedevo, nello smaltimento del modulo DEVO annullare l'iscrizione all'evento?

Inoltre, tutto il controllo presente nel modulo verrà eliminato quando i moduli vengono eliminati? in realtà chiama dispose su ciascun controllo in modo ricorsivo?

risposta

15

Non è necessario sganciare l'evento su Dispose se si sta collegando il proprio evento.

È necessario preoccuparsi solo se si sta agganciare un evento in un altro oggetto. La ragione di ciò è che gli hook di eventi mantengono vivo un riferimento per l'utente. Se non si riesce a sganciare, non si otterrà la garbage collection finché l'osservabile è ancora vivo.

Quando si collega il proprio evento, si ha un riferimento a se stessi, che è circolare, quindi non è necessario preoccuparsi di esso.

Sono venuto per supportare motivi di eventi più liberamente accoppiati per questo motivo. Questo è il posto n. 1 per perdite di memoria in .Net. Preferisco lo schema Event Aggregator (con weak events).

+0

Grazie per l'ottima spiegazione. Ha perfettamente senso per non essere sganciato quando ti stai agganciando a te stesso. – pdiddy

1

Fino a quando il codice di gestore di eventi è la forma in sé, quindi non avrebbe bisogno di annullare gli eventi - come non ci sarebbe stato un gestore di eventi penzoloni ai controlli come la forma stessa sarebbe distrutto

2

Sulla domanda "in effetti verrà chiamata dispose su ciascun controllo in modo ricorsivo?", La risposta è sì.

Un semplice test può essere eseguito inserendo un punto di interruzione nel metodo Dispose di un controllo.

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); 
    } 
} 
Problemi correlati