Как IDisposable реализован в FileStream в .Net 1.1
-
06-09-2019 - |
Вопрос
Это может показаться странным вопросом, но я смотрел на него, потому что слышал, как кто-то утверждал, что вы должны вызывать Close() для FileStream, даже если он находится в блоке использования (и у них есть код, в котором вызывается Close() прямо в конце блока).
Я знаю, что Close() предназначен для вызова Dispose(), но я решил посмотреть глубже, поскольку это код .Net 1.1, а большая часть моего опыта связана с версией 2.0.
Меня поразило то, что в документации MSDN для FileStream включены Dispose() и Dispose(bool) для .Net 2.0, но только Dispose(bool) для .Net 1.1.
Я подумал, что это может быть оплошностью, поэтому я использовал Reflector для просмотра сборки - и там я тоже вижу Dispose(bool), но нет Dispose().
Это верно?Если да, то какая здесь история?FileStream работает в блоке using, что, как я думал, означает, что он должен реализовать IDisposable, который, насколько мне известно, объявляет только Dispose().
Происходит ли какое-то волшебство компилятора, или мне где-то не хватает скрытой реализации Dispose() (которая, предположительно, вызывает Dispose(true) или Dispose(false) ?)
Наконец (без каламбура), можете ли вы подтвердить, что определение области действия FileStream в блоке using закроет поток при выходе из области действия в .Net 1.1?
[редактировать]
Просто чтобы уточнить: это код C#.Я понимаю, что в VB.Net не было оператора using до .Net 2.0, но насколько я понимаю, он был в C# в версии 1.1 (и мой код 1.1 содержит его и компилирует).
Решение
Реализовано немного смешно, но оно есть:Базовый класс для FileStream:System.IO.Stream реализует IDisposable (FileStream просто наследует его).
Класс базового потока явно реализует Dispose(), поэтому вы увидите Dispose() только в том случае, если вы преобразуете поток как IDisposeable (что и делает использование {}).
Stream.Dispose() вызывает Stream.Close().
(получил все это через Reflector)