System.IO.Stream одноразовый с ридером - PullRequest
1 голос
/ 28 марта 2009

Не могу вспомнить, где я это читал, но я помню парня из MS, который сказал, что как только вы создадите ридер вокруг System.IO.Stream, поток больше не будет отвечать за удаление потока.

Это правда? Кто-нибудь может это подтвердить? Может быть, предоставить ссылку.

Это означает, что внешнее использование в этом коде избыточно

using (var s = new FileStream(@"c:\file.txt",FileMode.Open)) {
    using (var reader = new StreamReader(s)) {
         reader.ReadToEnd();
    }
}

Ответы [ 4 ]

2 голосов
/ 29 марта 2009

Если не является избыточным, по причине того, что строка "new StreamReader(s)" может завершиться ошибкой (выдается исключение). Это будет означать, что блок no using собирается в Dispose() поток. На самом деле это маловероятно ... но могло бы! Например, поток может быть недоступен для чтения (или как угодно).

Таким образом, всегда лучше охранять такую ​​инициализацию; гораздо лучше избавляться дважды, чем вовсе. Кроме того, читателю (и всем инструментам анализа кода) становится очевидным, что определенно очищено после себя.

2 голосов
/ 28 марта 2009

Оба FileStream и StreamReader реализуют IDisposable, поэтому я бы использовал оба using независимо от этого, так что если бы базовая реализация изменилась, как бы маловероятно, ваш код все равно был бы хорошим. *

2 голосов
/ 28 марта 2009

прочитайте одобренный ответ на этот вопрос:

Кто распоряжается публичной собственностью?

В нем говорится, что StreamReader всегда удаляет базовый поток.

1 голос
/ 29 марта 2009

Для справки вам нужно взглянуть на страницу MSDN для защищенного Dispose (bool) , где действительно указано, что TextReader закроет основной поток.

Но я согласен с Митчем Уитом, что все еще хорошая идея использовать вложенный using{}, этот пример MSDN также делает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...