C # Form.Close vs Form.Dispose

Soy nuevo en C # e intenté ver las publicaciones anteriores, pero no encontré una buena respuesta.

En una aplicación C # Windows Form con un solo formulario, ¿está utilizando Form.Close() better 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.

¿Uno tiene una ventaja sobre el otro? ¿Bajo qué escenarios deberíamos preferir uno sobre el otro?

Este foro en MSDN te lo dice.

Form.Close() envía los mensajes de Windows adecuados para cerrar la ventana de win32. Durante ese proceso, si el formulario no se mostró de forma modal, se llama a Dispose en el formulario. La eliminación del formulario libera los recursos no gestionados a los que se aplica el formulario.

Si realiza un form1.Show() o Application.Run(new Form1()) , se llamará a Dispose cuando se llame a Close() .

Sin embargo, si form1.ShowDialog() el formulario form1.ShowDialog() para mostrar el formulario de manera modal, el formulario no se eliminará, y deberá llamar a form1.Dispose() usted mismo. Creo que esta es la única vez que debe preocuparse por tirar el formulario usted mismo.

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

Con mucha frecuencia, 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.

No llamar a Close probablemente evite enviar un montón de mensajes de Win32 que uno pensaría que son un tanto importantes, aunque no pude decirle específicamente por qué …

Close tiene el beneficio de generar eventos (que se pueden cancelar) de modo que un extraño (en el formulario) pueda observar FormClosing y FormClosed para reactjsr en consecuencia.

No estoy FormClosing si FormClosing y / o FormClosed se FormClosed si simplemente FormClosed el formulario, pero se lo dejo a usted para que experimente.

Usar using es una muy buena manera:

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