2011-12-24 9 views

risposta

40

Nessuno dei due è "migliore" dell'altro; sono perfettamente equivalenti!

Tuttavia, in questo caso particolare, sono entrambi errati. Il ShowDialog method richiede di chiamare il metodo Dispose nel modulo. A differenza della combinazione Show e Close, questa operazione non viene eseguita automaticamente. Da MSDN:

Quando un modulo viene visualizzato come una finestra di dialogo modale, facendo clic sul pulsante Chiudi (il pulsante con una X nell'angolo in alto a destra del modulo) fa sì che il modulo per essere nascosto e la proprietà DialogResult da impostare su DialogResult.Cancel. A differenza dei moduli non modali, il metodo Close non viene chiamato da .NET Framework quando l'utente fa clic sul pulsante del modulo di chiusura di una finestra di dialogo o imposta il valore della proprietà . Invece il modulo è nascosto e può essere mostrato di nuovo senza creare una nuova istanza della finestra di dialogo. Perché un modulo visualizzato come una finestra di dialogo è nascosto anziché chiuso, è necessario chiamare il metodo Dispose del modulo quando il modulo non è più necessario dall'applicazione.

Pertanto, si dovrebbe scegliere tra una di queste forme (equivalenti):

using (Form1 frm = new Form1()) 
{ 
    frm.ShowDialog(); 
} 

o

Form1 frm = new Form1(); 
frm.ShowDialog(); 
frm.Dispose(); 

La ragione per cui ShowDialog non dispone automaticamente il modulo è abbastanza semplice, se non immediatamente ovvio. Risulta che le applicazioni spesso desiderano leggere valori da un'istanza di una finestra di dialogo modale dopo il il modulo è stato chiuso, ad esempio le impostazioni specificate nei controlli del modulo. Se il modulo fosse stato eliminato automaticamente, non sarebbe possibile leggere quei valori accedendo alle proprietà dell'oggetto modulo. Pertanto, il programmatore è responsabile per lo smaltimento di moduli mostrati come finestre di dialogo modali quando (s) ha finito con loro.

+0

Eccellente chiarimento sul motivo per cui MODAL mantiene il modulo in memoria per estrarre gli altri elementi alla sua chiusura e non rilasciato automaticamente. – DRapp

+0

Giusto per chiarire: se l'istanza del form è contenuta in una variabile locale, sarà idonea per la garbage collection quando esce dall'ambito e verrà * eventualmente * smaltita (si veda questo SO [risposta] (http://stackoverflow.com)/a/11690188/945.456)). Ancora una buona idea di farlo in modo esplicito, ovviamente. –

+0

Tranne il resto, la prima frase è ** sbagliata **. Dal momento che devi/dovrebbe chiamare 'frm.Dispose();' il secondo è peggio del primo. _ Che vergogna_ in vista della buona risposta dopo! – Bitterblue

2

In generale vorrei andare per la prima 1 perché è possibile accedere al modulo dopo.

Altrimenti il ​​2 ° è ok, se non si vuole occuparsene dopo che è chiuso.

+0

la memoria dispose() in (new form1()). ShowDialog(); ? –

+0

stai chiedendo se la memoria è stata eliminata dopo che è stato completato lo showdialog. Se è così, allora la memoria per qualsiasi oggetto in C# viene eliminata quando nulla lo fa più. Quindi, una volta chiusa la finestra di dialogo, tutti i riferimenti sono andati e il GC farà il suo dovere. –

Problemi correlati