2009-03-05 5 views
1

Dans une question précédente sur débarrasser la barre d'état système d'un ancien NotifyIcon on m'a dit que je devrais Disposer tout ce qui implémente IDisposable. Cela me semble être une bonne pratique, mais en tant que débutant, cela soulève plus de questions :-)Quand dois-je éliminer les commandes manuellement? Comment savoir si un contrôle implémente IDisposable?

Comment savoir si un contrôle implémente IDisposable?

Dois-je créer une classe qui tente de tout éliminer sur tous mes formulaires dans l'événement déclaré?

Quelque chose comme ça (psuedocode):

foreach(control cont in form) 
{ 
try{cont.Dispose()} 
catch{} 
} 

Sinon, comment puis-je savoir quels contrôles je aurais besoin de disposer manuellement, ou devrais-je regarder simplement un comportement inhabituel au cours des essais?

G

EDIT: Alors, quand je clique sur le grand « X » rouge sur ma forme d'enfant, qui ne sont pas la cause de disposer? Est-ce correct? Quelle est la raison pour ça?

Répondre

2

Tout contrôle appartenant au formulaire est éliminé lorsque le formulaire est éliminé. En d'autres termes, lorsque vous appelez Dispose(), un contrôle appelle Dispose() sur tous ses enfants. Notez que masquer un formulaire n'appelle pas Dispose(), mais dans la plupart des cas, il suffit de créer une boîte de dialogue et de l'éliminer si nécessaire.

C'est toujours le cas pour les formulaires et commandes générés par les concepteurs. Si vous créez un composant non-visuel comme NotifyIcon dans le code (sans définir le propriétaire), vous devez en disposer manuellement. Mais il est généralement plus facile de définir le propriétaire correctement. Toute classe implémentant IDisposable doit appeler Dispose() sur ses fils, peu importe si elle est dans une collection ou dans une propriété, sauf s'il y a une bonne raison de ne pas le faire (dans certains cas, l'appelant peut rester propriétaire d'un objet). mais c'est exactement là où le concept de définir la propriété est pour).

0

Vous pouvez vérifier avec l'opérateur est, qu'un objet met en œuvre IDisposable:

if(object is IDisposable) { 
    ((IDisposable)object).Dispose(); 
} 
2

Une option consiste à exécuter FxCop sur vos assemblées. Une de ses règles vérifiera que Dispose est appelé sur tous les objets qui implémentent IDisposable, et vous avertira si vous avez des violations.

EDIT: Pour répondre à votre question plus tard, Dispose n'est pas appelé automatiquement. Vous devez gérer cela vous-même. Voici one article sur le sujet.

Questions connexes