J'ai une simple application WPF à fenêtre unique qui contient des zones de texte et des boutons. Et j'utilise aussi NotifyIcon et DateTimePicker de Windows Forms dans la fenêtre WPF. Comment puis-je éliminer efficacement toutes les commandes?Quand appeler la méthode Dispose() dans l'application WPF
Répondre
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.
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.
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é.
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);
}
}