2009-08-07 17 views

Respuesta

5

Casi nada en WPF tiene un método Dispose. La gran mayoría de las clases encapsula información puramente administrada. Puede adjuntar un objeto al árbol (por ejemplo, a través de un método Children.Add) y puede eliminarlo nuevamente, así es como funciona la administración del estado. No encaja exactamente en el patrón IDisposable, porque una vez que haya eliminado un control puede agregarlo nuevamente, mientras que Dispose significa para siempre (aunque puede usar Dispose para administrarlo además de los métodos Add/Remove).

A discussion about it on the Microsoft forums.

Hay algunas cosas que debería ser IDisposable pero no son, como DispatcherTimer, y no hay nada que le impida la aplicación de IDisposable en sus propias clases. Depende de usted cuándo llamar al Dispose; básicamente cuando sabes que ya no vas a utilizar el objeto.

Para un Window simplemente llame al Close para cerrarlo, y WPF se ocupa de todo lo demás.

1

Diría que la misma regla se aplica en aplicaciones WPF como en cualquier otra aplicación .NET: si un objeto implementa IDisposable, debe llamar al Dispose cuando termine de usarlo. Si carga y descarga dinámicamente los controles, y no implementan IDisposable, basta con establecer referencias a null (y separar cualquier controlador de eventos) para que el recolector de basura pueda hacer su trabajo.

0

Si ese control es parte de algún IContainer (ese es el modelo común en .NET) entonces sus controles solo necesitan implementación de IDisposable. Por lo tanto, se llamará a Dispose() automáticamente cuando sea el momento apropiado.

0

Adhiérase a CA1001: Deje que el tipo propietario implemente IDisposable.

Renounce la verdad antigua de Windows Forms que todos los controles son IDisposable. Implemente y llame al Dispose.

sealed partial class MainWindow : IDisposable { 
    readonly IDisposable disposable; 
    public MainWindow() { 
     disposable = ... 
    } 

    public void Dispose() { 
     disposable.Dispose(); 
    } 

    protected override void OnClosed(EventArgs e) { 
     Dispose(); 
     base.OnClosed(e); 
    } 
} 
Cuestiones relacionadas