2011-12-24 23 views

Respuesta

40

Ninguno de los dos es "mejor" que el otro; ¡Son perfectamente equivalentes!

Sin embargo, en este caso particular, son incorrectos. El ShowDialog method requiere que llame al método Dispose en el formulario. A diferencia de la combinación Show y Close, esto no se hace automáticamente. De MSDN:

Cuando se muestra un formulario como un cuadro de diálogo modal, al hacer clic en el botón Cerrar (el botón con una X en la esquina superior derecha de la forma) hace que la forma que se oculta y la propiedad DialogResult para establecerse en DialogResult.Cancel. A diferencia de los formularios no modales, el .NET Framework no llama al método Close cuando el usuario hace clic en el botón Cerrar formulario de un cuadro de diálogo o establece el valor de la propiedad DialogResult. En cambio, el formulario está oculto y se puede volver a mostrar sin crear una nueva instancia del cuadro de diálogo. Como un formulario que se muestra como un cuadro de diálogo está oculto en lugar de cerrado, debe llamar al método Dispose del formulario cuando la aplicación ya no lo necesita.

Por lo tanto, debe elegir entre una de estas formas (equivalentes):

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

o

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

La razón de que ShowDialog no dispone automáticamente el formulario es bastante simple, si no es inmediatamente obvio. Resulta que las aplicaciones a menudo desean leer los valores de una instancia de un cuadro de diálogo modal después de el formulario se ha cerrado, como la configuración especificada en los controles del formulario. Si el formulario se eliminó automáticamente, no podrá leer esos valores accediendo a las propiedades del objeto de formulario. Por lo tanto, el programador es responsable de eliminar los formularios que se muestran como diálogos modales cuando haya terminado con ellos.

+0

Excelente aclaración sobre por qué MODAL mantiene el formulario en la memoria para extraer los otros elementos al cierre y no se libera automáticamente. – DRapp

+0

Solo para aclarar: si la instancia del formulario se mantiene en una variable local, será elegible para la recolección de elementos no utilizados cuando salga del alcance y * eventualmente * se eliminará (consulte este SO [respuesta] (http://stackoverflow.com)/a/11690188/945456)). Todavía es una buena idea hacerlo explícitamente, por supuesto. –

+0

Excepto el resto, la primera oración es ** incorrecta **. Como debe/debe llamar a 'frm.Dispose();' el segundo es peor que el primero. ¡Qué vergüenza, en vista de la buena respuesta después! – Bitterblue

2

Generalmente me inclinaría por la primera 1 porque se puede acceder al formulario después.

De lo contrario, el 2do encendido está bien, si no desea tratar con él después de que se cierre.

+0

la memoria dispone() at (new form1()). ShowDialog(); ? –

+0

pregunta si la memoria está dispuesta después de que el showdialog haya finalizado. Si es así, entonces la memoria para cualquier objeto en C# se elimina una vez que ya no haya más referencias. Entonces, una vez que el diálogo está cerrado, todas las referencias desaparecen y el GC hará lo suyo. –

Cuestiones relacionadas