2010-06-22 31 views
53

Soy nuevo en C#, y traté de ver las publicaciones anteriores, pero no encontré una buena respuesta.C# Form.Close vs Form.Dispose

En una aplicación C# Windows Form con un solo formulario, ¿está utilizando Form.Close() mejor o Form.Dispose()?

MSDN dice que todos los recursos dentro del objeto se cierran y el formulario se elimina cuando se invoca un Cierre. A pesar de eso, he encontrado varios ejemplos en línea que siguen un Dispose en lugar de un Close.

¿Tiene alguna ventaja sobre la otra? ¿Bajo qué escenarios deberíamos preferir uno sobre el otro?

+0

pregunta un poco diferente, misma respuesta, la OMI: es decir, Cerrar y botar lo general son equivalentes, excepto que usted puede llamar a cerrar más de una vez. – ChrisW

+2

@Chrisw: también puede llamar a Dispose más de una vez. –

+0

@ChrisW, Dispose debe diseñarse para que funcione más de una vez también. http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae –

Respuesta

117

This foro en MSDN le dice que.

Form.Close() envía los mensajes adecuados de Windows para apagar el ventana de Win32. Durante ese proceso, si el formulario no se mostró de forma modal, Dispose es llamado en el formulario. La eliminación del formulario libera los recursos no administrados que contiene el formulario.

Si lo hace un form1.Show() o Application.Run(new Form1()), a disponer se llamará cuando Close() se llama.

Sin embargo, si lo hace form1.ShowDialog() para mostrar la forma modal, no se dispone la forma , y necesitará llamar form1.Dispose() mismo. I cree que esta es la única vez que debería preocuparse por tirar el formulario usted mismo.

+0

¿Por qué se votó por este motivo? –

+0

¿Incluyó la primera versión la cita? +1 para compensar –

+0

@Dan la primera versión es una mierda ... (Lo siento @Kyra) – jjnguy

5

no llamar Close probablemente pasa por encima de enviar un montón de mensajes de Win32, que uno pensaría que son algo importante aunque no podría decir específicamente qué ...

Close tiene la ventaja de aumentar los eventos (que puede se cancelará) de forma que un extraño (en el formulario) pueda mirar FormClosing y FormClosed para reaccionar en consecuencia.

No estoy seguro si FormClosing y/o FormClosed se plantean si simplemente descarta el formulario, pero lo dejo para que pueda experimentar.

+2

Si desecha el formulario, no se invocan los eventos de cierre y cerrado. – matrix

+4

llamando El método Dispose provocaría el parpadeo de la ventana cuando se usa en Modal-Form sobre la ventana mdi-child – dotNETbeginner

12

Como regla general, siempre recomendaría explícitamente llamar al método Dispose para cualquier clase que lo ofrezca, ya sea llamando directamente al método o envolviéndolo en un bloque "using".

En la mayoría de los casos, las clases que implementan IDisposible lo hacen porque envuelven algunos recursos no administrados que deben liberarse. Si bien estas clases deben tener finalizadores que actúen como una salvaguarda, llamar a Dispose ayudará a liberar esa memoria antes y con una sobrecarga menor.

En el caso del objeto Form, como señaló el enlace de Kyra, el método Close está documentado para invocar Dispose en su nombre, por lo que no necesita hacerlo explícitamente. Sin embargo, para mí, eso siempre ha sido como confiar en un detalle de implementación. Prefiero llamar siempre a Cerrar y Descartar para las clases que los implementan, para evitar cambios/errores de implementación y para ser claros.Un método Dispose correctamente implementado debería ser seguro invocar varias veces.

0

Usando using es una muy buena manera:

using (MyForm foo = new MyForm()) 
{ 
    if (foo.ShowDialog() == DialogResult.OK) 
    { 
     // your code 
    } 
} 
+0

Una instrucción 'using' solo llama a' Dispose', lo cual es una buena práctica, pero no creo que responda la pregunta del OP . –