2011-11-10 14 views
14

Ho ereditato del codice e volevo eseguire questa modifica da parte vostra, la mia preoccupazione è la gestione della memoria.Modulo di dialogo WinForms: Chiudi o Disponi?

Diciamo che ho una forma "base" con un gruppo di pulsanti che aprono i moduli di "dialogo". Qual è il modello consigliato per l'apertura dei moduli di dialogo? Attualmente visualizziamo il modulo di "dialogo" in questo modo (nel codice Form "base", al tasto di scatto):

ChangePasswordForm frm = new ChangePasswordForm(); 
frm.ShowDialog(); 

quindi chiuderlo in questo modo (nella "finestra di dialogo" codice del modulo):

private void bCancel_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
    //this.Dispose(); <-- this is what I am considering adding. 
} 

La mia motivazione per l'aggiunta di Dispose è che sono preoccupato se questo modulo viene visualizzato e chiuso più volte ogni volta che viene creata una nuova istanza e le sue risorse non sono mai realmente rilasciate - è corretto? Inoltre, se il modulo ha la "stretta" X in alto a destra, dovrei inserire anche una chiamata Dispose() nell'evento FormClosed?

Grazie in anticipo.

+0

Beh, ho letto questo [link] (http://blog.tylerholmes.com/2008/09/what-difference-between-dispose-and.html) e l'ho trovato interessante. Potrei aiutarti, lo spero. – Kani

risposta

24

userei un using dichiarazione:

using (var frm = new ChangePasswordForm()) { 
     frm.ShowDialog(); 
    } 

combinare questo con un DialogResult:

private void bCancel_Click(object sender, EventArgs e) 
{ 
    this.DialogResult = DialogResult.Cancel; 
} 

Impostazione del DialogResult, chiuderà la finestra di dialogo, e il chiamante/proprietario ha un feedback.

E non devi preoccuparti di Chiudere o Smaltire.

+0

Grazie, è impostato il DialogResult che invia il blocco using "out of scope", per così dire? – mikey

+0

Impostando DialogResult, si chiuderà la finestra di dialogo e verrà restituita la chiamata ShowDialog. ShowDialog, mostra il modulo in modalità "modale", il codice chiamante viene bloccato fino alla chiusura della finestra di dialogo. – GvS

+0

Eccellente, grazie! – mikey

18

Secondo MSDN è necessario disporre due condizioni:

Le due condizioni quando un modulo non è disposto sul primo è quando (1) è parte di un interfaccia a documenti multipli (MDI) e la forma non è visibile; e (2) hai visualizzato il modulo usando ShowDialog. In questi casi, dovrai chiamare Dispose manualmente per contrassegnare tutti i controlli del modulo per la garbage collection.

MSDN Form.Close

Dichiarare il modulo in un'istruzione using sarebbe il modo appropriato per gestire questa situazione.

 using (ChangePasswordForm frm = new ChangePasswordForm()) 
     { 
      frm.ShowDialog(); 
     } 
+0

Grazie anche a +1. – mikey

Problemi correlati