2011-09-24 7 views
5

¿Qué sucede cuando cierro un formulario, que se abrió usando Show(), usando Dispose() en lugar de Close()? ¿Puede alguien decirme en detalle qué sucede en el método Dispose()?Usar el método dispose() en lugar del método close() en un formulario

+0

C# no tiene formularios. Especifique WinForms/WPF/... –

+0

@Henk Holterman: actualicé mi pregunta – Selo

+0

[¿Debo eliminar un formulario después de cerrar el formulario?] (Https://stackoverflow.com/a/39501121/3110834) –

Respuesta

6

La diferencia básica entre Close() y Dispose() es que, cuando se llama a un método Close(), cualquier recurso gestionado se puede cerrar temporalmente y se puede abrir una vez más. Significa que, con el mismo objeto, el recurso se puede volver a abrir o usar. Donde el método Dispose() elimina permanentemente cualquier recurso ((des) administrado) de la memoria para la limpieza y el recurso ya no existe para ningún procesamiento posterior.


O simplemente una afirmación general. Con el objeto de conexión que llama al Close(), se liberará la conexión nuevamente en el grupo. Llamando al Dispose() llamará al Close() y luego establecerá la cadena de conexión en nulo.

Algunos objetos, como Stream, implementan IDisposable, pero el método Dispose solo está disponible si primero se aplica el objeto a un IDisposable. Sin embargo, expone un método Close().

Siempre diría que debe llamar al Dispose() en cualquier objeto que implemente IDisposable cuando haya terminado con el objeto. Incluso si no hace nada. El compilador de jit lo optimizará de todos modos con el código final. Si el objeto contiene un Close() pero no Dispose(), llame al Close().

También puede utilizar la instrucción using de objetos IDispoable

using(SqlConnection con = new SqlConnection()) 
{ 
    //code... 
} 

Para ello, será Dispose() en el SqlConnection cuando se sale del bloque.

3

Descompilación los dos métodos (Dispose y Close) Resulta que este último realiza dos comprobaciones adicionales y luego llama Dispose, al igual que este:

object[] objArray; 
if (base.GetState(262144)) 
{ 
    throw new InvalidOperationException(SR.GetString("ClosingWhileCreatingHandle", new object[] { "Close" })); 
} 
if (base.IsHandleCreated) 
{ 
    this.closeReason = CloseReason.UserClosing; 
    base.SendMessage(16, 0, 0); 
    return; 
} 
base.Dispose(); 

De la documentación:

Cuando una el formulario está cerrado, todos los recursos creados dentro del objeto se cierran y el formulario se elimina. [...] Las dos condiciones cuando un formulario no se elimina en Cerrar es cuando (1) es parte de una aplicación de interfaz de documentos múltiples (MDI) y el formulario 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.

Espero que ayude.

1

En realidad, en este caso Close() y Dispose() es bastante diferente:

Close cierra el formulario, enviando el mensaje de Windows apropiado.Podrá volver a abrir el formulario usando Open()

Dispose dispone completamente de los recursos de formulario, y no podrá volver a utilizar la instancia de formulario nuevamente.

Cuestiones relacionadas