Nous savons tous System.IO.StreamReader
n'est pas la seule classe .NET 4.0+ qui implémente IDisposable
et une méthode Close()
. Pour le cas de StreamReader
dans cette question, le code source montre que la classe de base TextReader.Close()
, TextReader.Dispose()
les deux courent les mêmes lignes de code. Vous pouvez également voir dans le code que TextReader.Dispose()
est l'implémentation pour quand vous appelez StreamReader.Dispose()
(parce que StreamReader
ne remplace pas cette signature de surcharge de méthode de Dispose
).
donc un appel à StreamReader.Dispose()
se déroulera this inherited line of code, qui appelle la méthode protected override StreamReader.Dispose(disposing: true)
et il en sera StreamReader.Close()
appel StreamReader.Dispose(disposing: true)
. Donc, pour le cas de StreamReader
, Close()
et Dispose()
se produisent pour exécuter les mêmes lignes de code.
Une réponse plus générale, non spécifique à la classe à la question de Close() ou Dispose()?, pourrait être de noter que Microsoft a assez clair documentation on implementing IDisposable
and the Dispose pattern. Une lecture rapide est suffisante pour vous montrer que l'implémentation d'une méthode Close()
n'est pas une exigence du modèle Dispose.
Imho la raison de trouver la méthode Close()
sur tant de classes qui implémentent IDisposable
, est le résultat de la convention, pas exigence.
Quelqu'un a commenté
Close and Dispose - which to call?
Un exemple d'une autre classe qui implémente IDisposable
avec le modèle Dispose, et a une méthode Close()
. Est-ce que Close()
utilise le même code que Dispose()
dans ce cas? Je n'ai pas regardé le code source, mais je ne le dirais pas nécessairement.
http://stackoverflow.com/q/61092/102112 – Alex