2010-05-17 5 views

Répondre

2

types avec des ressources devraient mettre en œuvre IDisposable, et de libérer ces ressources se fait en appelant Dispose (ou les envelopper dans un communiqué using). GC.Collect n'est nécessaire que pour les objets mal écrits qui ont des ressources mais n'implémentent pas IDisposable.

+0

c'est malheureusement le cas :( – user1112111

+0

@Tesserex: Ce n'est pas tout à fait vrai Les classes qui référencent des ressources non managées implémenteront typiquement un finaliseur Les finaliseurs seront exécutés par le garbage collector Bien sûr, une classe avec des ressources non managées, mais sans un finaliseur a été mal conçu – Steven

+1

@ user1112111: Je "pousse" les producteurs de code incorrect à corriger leur code, mais GC.Collect est un moyen de faire fonctionner leur mauvais code, au moins dans la mesure du possible. D'un autre côté, s'ils ne peuvent même pas le faire correctement, il faut se demander combien d'autres bugs se cachent dans leurs classes ... –

2

Cela dépend de quelles ressources vous voulez dire.

Si vous parlez simplement de mémoire, le GC va en effet gérer cela pour vous lorsqu'il n'y a plus aucune référence à l'objet. L'appel de GC.Collect invite le GC à s'exécuter, mais il n'y a jamais de garantie quant à l'exécution du GC, même si vous appelez GC.Collect car il fonctionne sur un thread séparé. Si vous parlez de ressources non managées, telles que les handles de fichiers, les connexions DB et autres, la meilleure façon de les gérer est d'implémenter l'interface IDispsable, et ces ressources seront ensuite libérées par les appelants de votre code appelant le Disposez la méthode (ou bien le GC disposant de votre objet).

Questions connexes