Ce conseil rapide potentiel est devenu une longue réponse. Désolé.
Comme l'a souligné Tyler dans sa belle réponse, l'appel Dispose()est une excellente pratique de programmation. C'est parce que cette méthode est censée «rassembler» toutes les ressources nécessaires pour libérer des ressources afin qu'il n'y ait pas de ressources ouvertes inutiles. Si vous avez écrit du texte dans un fichier, par exemple, et que vous n'avez pas réussi à fermer le fichier (libérer la ressource), il restera ouvert et personne d'autre ne pourra y écrire jusqu'à ce que le GC arrive et fasse ce que vous devriez avoir terminé.
Maintenant, dans certains cas, il y aura des méthodes de "finalisation" plus spécifiques à la classe avec laquelle vous avez affaire, comme StreamWriter.Close(), qui remplace TextWriter.Close(). En effet, ils sont généralement plus adaptés à la situation: un StreamWriter Close(), par exemple, vide le flux et l'encodeur sous-jacent avant la création Dispose()de l'objet! Cool!
Cependant, en parcourant MSDN, vous constaterez que même Microsoft est parfois confus par la multitude de fermetures et de disposers. Dans cette page Web , par exemple, dans certains exemples, il Close()est appelé avant l'implicite Dispose()(voir l' instruction using si vous ne comprenez pas pourquoi c'est implicite), et dans un en particulier, ils ne se soucient pas. Pourquoi cela serait-il? Moi aussi, j'étais perplexe.
La raison pour laquelle j'ai pensé (et, je le souligne, il s'agit d' une recherche originale et je pourrais sûrement perdre ma réputation si je me trompe) est que cela Close()pourrait échouer, ce qui Dispose()donnerait une exception tout en laissant les ressources ouvertes, tout en les libérant sûrement . C'est pourquoi un Dispose()devrait toujours sauvegarder un Close()appel (désolé pour le jeu de mots).
MyResource r = new MyResource();
try {
r.Write(new Whatever());
r.Close()
finally {
r.Dispose();
}
Et oui, je suppose que Microsoft a glissé sur cet exemple. Peut-être que cet horodatage ne serait jamais vidé dans le fichier.
Je corrige mon ancien code demain.
Edit: désolé Brannon, je ne peux pas commenter votre réponse, mais êtes-vous sûr que c'est une bonne idée d'appeler Close()sur un finallybloc? Je suppose qu'une exception à cela pourrait ruiner le reste du bloc, qui contiendrait probablement un code de nettoyage important.
Réponse à Brannon: super, n'oubliez pas d'appeler Close()quand c'est vraiment nécessaire (par exemple lorsque vous traitez avec des flux - je ne sais pas grand-chose sur les connexions SQL dans .NET).