Soy nuevo en C # e intenté mirar las publicaciones anteriores pero no encontré una buena respuesta.
En una aplicación de Windows Form de C # con un solo formulario, ¿se usa Form.Close()
mejor o Form.Dispose()
?
MSDN dice que todos los recursos dentro del objeto están cerrados y el formulario se elimina cuando se invoca un cierre. A pesar de ello, me he encontrado con varios ejemplos en línea que siguen a Dispose en lugar de Close.
¿Tiene uno alguna ventaja sobre el otro? ¿Bajo qué escenarios deberíamos preferir uno sobre el otro?
form.Visible = false;
puedes llamarform.Hide()
. De hecho,form.Hide()
simplemente establecethis.Visible = false;
.Respuestas:
Este foro en MSDN te lo dice.
fuente
Como regla general, siempre recomendaría llamar explícitamente al método Dispose para cualquier clase que lo ofrezca, ya sea llamando al método directamente o envolviéndolo en un bloque "using".
Muy a menudo, las clases que implementan IDisposible lo hacen porque envuelven algún recurso no administrado que debe liberarse. Si bien estas clases deben tener finalizadores que actúen como una protección, llamar a Dispose ayudará a liberar esa memoria antes y con menos gastos generales.
En el caso del objeto Form, como se indica en el enlace de Kyra, el método Close está documentado para invocar Dispose en su nombre, por lo que no es necesario que lo haga explícitamente. Sin embargo, para mí, eso siempre me ha parecido depender de un detalle de implementación. Prefiero llamar siempre tanto a Close como a Dispose para las clases que los implementan, para protegerme de cambios / errores de implementación y por el bien de ser claro. Un método Dispose implementado correctamente debe ser seguro para invocar varias veces.
fuente
No llamar
Close
probablemente evita el envío de un montón de mensajes Win32 que uno pensaría que son algo importantes, aunque no podría decirle específicamente por qué ...Close
tiene el beneficio de generar eventos (que pueden cancelarse) de modo que un extraño (al formulario) pueda observarFormClosing
yFormClosed
reaccionar en consecuencia.No tengo claro si
FormClosing
y / oFormClosed
se plantean si simplemente desechas el formulario, pero te lo dejo para que lo experimentes.fuente
Usar
using
es una forma bastante buena:using (MyForm foo = new MyForm()) { if (foo.ShowDialog() == DialogResult.OK) { // your code } }
fuente
Cerrar (): el recurso administrado se puede cerrar temporalmente y volver a abrirse.
Dispose (): elimina permanentemente el recurso administrado o no administrado
fuente
ShowDialog()
. De lo contrario,Close()
también desechará el formulario.Si usa form.close () en su formulario y establece el Evento FormClosing de su formulario y usa form.close () en este Evento, cae en un bucle ilimitado y se produjo un Argumento fuera del rango y la solución es cambiar el formulario .close () con form.dispose () en caso de FormClosing. Espero que este pequeño consejo te ayude !!!
fuente
Lo que acabo de experimentar con las herramientas de diagnóstico de VS es que llamé a this.Close () y luego se activó el evento de cierre. Luego, cuando llamo a this.Dispose () al final del evento Formclosing donde elimino muchos otros objetos, limpia todo mucho más suavemente.
fuente