Ce qui devait être un conseil rapide est devenu une longue réponse. Désolé.
Comme Tyler l'a souligné dans sa réponse, appeler Dispose()
est une excellente pratique de programmation. En effet, cette méthode est censée "rassembler" toutes les libérations de ressources nécessaires pour 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 fermé le fichier (libéré la ressource), il restera ouvert et personne d'autre ne pourra y écrire jusqu'à ce que la GC fasse ce que vous auriez dû faire.
Maintenant, dans certains cas, il y aura des méthodes de "finalisation" plus spécifiques à la classe que vous traitez, telles que StreamWriter.Close()
qui prévaut sur TextWriter.Close()
. En effet, ils sont généralement plus adaptés à la situation : la fonction d'un StreamWriter Close()
par exemple, vide le flux de données et l'encodeur sous-jacent avant que la fonction Dispose()
de l'objet ! Cool !
Toutefois, en parcourant MSDN, vous constaterez que même Microsoft est parfois dérouté par la multitude de fermeurs et de broyeurs. Dans cette page web par exemple, dans certains exemples Close()
est appelé avant la fonction implicite Dispose()
(voir en utilisant l'énoncé si vous ne comprenez pas pourquoi c'est implicite), et dans un cas en particulier, ils ne prennent pas la peine de le faire. Pourquoi ? Moi aussi, j'étais perplexe.
La raison pour laquelle je me suis dit (et, je le souligne, c'est recherche originale et je pourrais sûrement perdre ma réputation si je me trompe) est que Close()
pourrait échouer, produisant une exception tout en laissant les ressources ouvertes, alors que Dispose()
les libérerait sûrement . C'est pourquoi a Dispose()
devrait toujours sauvegarder un Close()
appelez (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 dérapé sur cet exemple. Peut-être que cet horodatage n'aurait jamais été envoyé dans le fichier.
Je répare 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 finally
bloc ? Je suppose qu'une exception à ce niveau pourrait ruiner le reste du bloc, qui contiendrait probablement un code de nettoyage important.
Réponse à Brannon : super, mais n'oubliez pas d'appeler. Close()
lorsqu'elle est vraiment nécessaire (par exemple, lorsqu'il s'agit de flux - je ne connais pas grand-chose aux connexions SQL dans .NET).