Как реализовано IDisposable в FileStream в .Net 1.1 - PullRequest
5 голосов
/ 02 июня 2009

Это может показаться странным вопросом, но я смотрел на него, потому что слышал, как кто-то утверждает, что вы должны вызывать Close () для FileStream, даже если он находится в блоке using (и у них есть код, где 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 не получал оператор использования до .Net 2.0, но, насколько я понимаю, он был в C # в 1.1 (и мой код 1.1 содержит его и компилирует)

1 Ответ

9 голосов
/ 02 июня 2009

Это реализовано немного забавно, но оно есть: Базовый класс для FileStream: System.IO.Stream реализует IDisposable (FileStream просто наследует его).

Базовый класс потока реализует Dispose () в явном виде, поэтому вы увидите Dispose (), только если вы приведете поток как IDisposeable (что и делает {}).

Stream.Dispose () вызывает Stream.Close ().

(получил все это через отражатель)

...