Вопрос

Это может показаться странным вопросом, но я смотрел на него, потому что слышал, как кто-то утверждал, что вы должны вызывать 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)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top