Мы все знаем, что System.IO.StreamReader
не единственный класс .NET 4.0+, который реализует IDisposable
и метод Close()
. В случае с StreamReader
в этом вопросе исходный код показывает, что базовый класс TextReader.Close()
, TextReader.Dispose()
оба запускают одни и те же строки кода. Вы также можете увидеть в коде, что TextReader.Dispose()
- это реализация, когда вы вызываете StreamReader.Dispose()
(потому что StreamReader
не переопределяет эту сигнатуру перегрузки метода Dispose
).
Так вызов StreamReader.Dispose()
будет работать this inherited line of code, который вызывает защищенный метод переопределения StreamReader.Dispose(disposing: true)
и так будет StreamReader.Close()
вызов StreamReader.Dispose(disposing: true)
. Поэтому для случая StreamReader
, Close()
и Dispose()
действительно выполняются те же строки кода.
Более общий, неклассовый ответ на вопрос Close() или Dispose()?, возможно, следует отметить, что у Microsoft достаточно ясный documentation on implementing IDisposable
and the Dispose pattern. Быстрого чтения достаточно, чтобы показать вам, что внедрение метода Close()
не является требованием шаблона Dispose.
imho причина нахождения метода Close()
на стольких классах, которые реализуют IDisposable
, является результатом соглашения, а не требований.
Кто-то заметил
Close and Dispose - which to call?
Примером другого класса, который реализует IDisposable
с шаблоном Dispose, и имеет метод Close()
. Выполняется ли Close()
тем же самым кодом, что и Dispose()
? Я не смотрел исходный код, но я бы сказал не обязательно.
http://stackoverflow.com/q/61092/102112 – Alex