2009-08-07 5 views

Répondre

5

Presque n'importe quoi dans WPF a une méthode Dispose. La grande majorité des classes encapsule des informations purement gérées. Vous pouvez joindre un objet dans l'arborescence (par exemple, via une méthode Children.Add) et vous pouvez le supprimer à nouveau - c'est ainsi que fonctionne la gestion d'état. Il ne correspond pas exactement au modèle IDisposable, car une fois que vous avez supprimé un contrôle, vous pouvez l'ajouter à nouveau, tandis que Dispose signifie toujours (bien que vous puissiez utiliser Dispose pour le gérer en plus des méthodes Add/Remove).

A discussion about it on the Microsoft forums.

Il y a quelques choses qui devraient être IDisposable mais ne sont pas, comme DispatcherTimer, et il n'y a rien pour vous empêcher de mettre en œuvre IDisposable sur vos propres classes. C'est à vous de composer le Dispose; fondamentalement quand vous savez que vous n'allez plus utiliser l'objet.

Pour Window vous appelez simplement Close pour le fermer, et WPF s'occupe de tout le reste.

1

Je dirais que la même règle s'applique dans les applications WPF comme dans toutes les autres applications .NET: si un objet implémente IDisposable, vous devez appeler Dispose lorsque vous avez fini de l'utiliser. Si vous chargez et déchargez dynamiquement des contrôles et qu'ils n'implémentent pas IDisposable, il suffit de définir des références à null (et de détacher les gestionnaires d'événements) pour que le garbage collector fasse son travail.

0

Si ce contrôle fait partie de IContainer (c'est le modèle commun dans .NET) que vos contrôles ont juste besoin d'implémentation de IDisposable. Ainsi, Dispose() sera appelé automatiquement quand il est temps approprié.

0

Adhérer à CA1001: Laisser le type propriétaire implémenter IDisposable.

Renoncez à l'ancienne version de Windows Forms que tous les contrôles sont IDisposable. Mettre en œuvre et appeler Dispose vous-mêmes.

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); 
    } 
} 
Questions connexes