2011-11-10 22 views
14

Heredé un código y quería ejecutar esta modificación por todos ustedes, mi preocupación es la administración de la memoria.Formulario de diálogo WinForms - ¿Cerrar o desechar?

Digamos que tengo un formulario "base" con un grupo de botones que abren formularios de "diálogo". ¿Cuál es el patrón recomendado para abrir los formularios de diálogo? Actualmente presentamos la forma "diálogo" como tal (en la "base" de código de forma, sobre el botón del ratón):

ChangePasswordForm frm = new ChangePasswordForm(); 
frm.ShowDialog(); 

Entonces cerrarla como tal (en el "diálogo" código del formulario):

private void bCancel_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
    //this.Dispose(); <-- this is what I am considering adding. 
} 

Mi razón para añadir Desechar es que estoy preocupado si se visualiza el formulario y cerrado muchas veces que cada vez que se crea una nueva instancia del formulario y sus recursos nunca son realmente puesto en libertad - ¿es esto correcto? Además, si el formulario tiene la X "cerrada" en la parte superior derecha, ¿debo poner una llamada a Dispose() en el evento FormClosed también?

Gracias de antemano.

+0

Bueno, he leído esta [link] (http://blog.tylerholmes.com/2008/09/what-difference-between-dispose-and.html) y pareció interesante. Podría ayudarte, espero. – Kani

Respuesta

24

me gustaría utilizar una declaración using:

using (var frm = new ChangePasswordForm()) { 
     frm.ShowDialog(); 
    } 

combinar esto con un DialogResult:

private void bCancel_Click(object sender, EventArgs e) 
{ 
    this.DialogResult = DialogResult.Cancel; 
} 

Ajuste del DialogResult, se cerrará el diálogo, y la persona que llama/propietario tiene algunos comentarios.

Y no tiene que preocuparse por Cerrar o Eliminar.

+0

Gracias, ¿se está configurando DialogResult que envía el bloque de uso "fuera del alcance", por así decirlo? – mikey

+0

Al establecer DialogResult, se cerrará el cuadro de diálogo y se devolverá la llamada a ShowDialog. ShowDialog, muestra el formulario en modo "modal", el código de llamada está bloqueado hasta que se cierre el diálogo. – GvS

+0

Excelente, ¡gracias! – mikey

18

Según MSDN usted necesita disponer bajo dos condiciones:

Las dos condiciones cuando una forma no está dispuesto en Cerrar es cuando (1) es parte de una interfaz de múltiples documentos (MDI) de aplicación , y la forma no es visible; y (2) ha mostrado el formulario usando ShowDialog. En estos casos, deberá llamar a Dispose manualmente para marcar todos los controles del formulario para la recolección de elementos no utilizados.

MSDN Form.Close

Declarar el formulario en una instrucción using sería la forma más adecuada para manejar esto.

 using (ChangePasswordForm frm = new ChangePasswordForm()) 
     { 
      frm.ShowDialog(); 
     } 
+0

Gracias también +1. – mikey

Cuestiones relacionadas