2010-05-02 13 views
11

Supponiamo Ho una forma aperta tramite il metodo .ShowDialog().C# - Rimuovere i gestori di eventi - eventi FormClosing o il metodo Dispose()

Ad un certo punto mi attribuiscono alcuni gestori di eventi ad alcuni controlli sul form.

ad es.

// Attach radio button event handlers. 
this.rbLevel1.Click += new EventHandler(this.RadioButton_CheckedChanged); 
this.rbLevel2.Click += new EventHandler(this.RadioButton_CheckedChanged); 
this.rbLevel3.Click += new EventHandler(this.RadioButton_CheckedChanged); 

Quando il modulo si chiude, devo rimuovere questi gestori, giusto?

Attualmente, sto facendo questo quando l'evento FormClosing è sparato.

ad es.

private void Foo_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // Detach radio button event handlers. 
    this.rbLevel1.Click -= new EventHandler(this.RadioButton_CheckedChanged); 
    this.rbLevel2.Click -= new EventHandler(this.RadioButton_CheckedChanged); 
    this.rbLevel3.Click -= new EventHandler(this.RadioButton_CheckedChanged); 
} 

Tuttavia, ho visto alcuni esempi in cui i gestori vengono rimossi nel metodo Dispose().

Esiste un modo "migliore pratica" per farlo?

(con C#, WinForms, NET 2,0)

Grazie.

+2

Perché dovresti prenderti cura di te stesso? Afaik il GC lo farà per te. – Fabian

+8

@Fabian: se avessi già saputo la risposta, non avrei postato la domanda. :) – Andy

risposta

16

Non è necessario rimuovere i gestori in questo caso perché né la forma né suoi pulsanti sono riferiti dal codice esterno alla forma, e l'intero grafo oggetto sarà quindi garbage collection.

+2

Esatto, quindi, dato che il modulo è eliminato, anche tutti i controlli su di esso sono presenti, il che significa che non ci sono collegamenti possibili per i gestori di eventi? Ho sempre pensato che se avessi creato qualcosa, avrei dovuto ripulire anche dopo. – Andy

+2

Esatto. Se volevi la raccolta di un oggetto in cui uno dei suoi metodi era il bersaglio di eventi in un altro oggetto che si stava aggrappando, dovresti rimuovere i gestori. In questo caso, tuttavia, gli oggetti (forma + pulsanti) si riferiscono solo l'un l'altro. –

+0

Grazie Ben, capito. – Andy

2

No, non è necessario rimuovere i gestori di eventi dai controlli sul form che si sta chiudendo. Saranno tutti disposti insieme.

Probabilmente stai pensando di pagine web in cui è richiesta la rimozione di gestori di eventi al fine di evitare perdite di memoria nel browser.

+0

I gestori di eventi lato server causano perdite di memoria nel browser? –

+1

No, i gestori di eventi lato browser causano perdite di memoria nel browser. Nei browser meno recenti, se si lasciano gli eventi di caricamento della pagina ecc. Collegati, quando l'URL cambia in una pagina diversa, l'evento di caricamento della pagina viene comunque collegato alla pagina precedente. Quindi, perdita di memoria. – dthorpe

Problemi correlati