Какой поток я закрываю, когда делаю композицию потока? - PullRequest
1 голос
/ 24 апреля 2011

Если у меня есть следующий код:

FileStream fs = new FileStream(...);
TextWriter tw = new StreamWriter(fs);

Должен ли я вызывать только tw.Close () или fs.Close ()? Я постоянно использую TextWriter во всем приложении, поэтому я не могу просто обернуть его в блок Using (...), поскольку мне нужно иметь возможность использовать его в нескольких точках.

В противном случае, я бы просто написал это как:

using (FileStream fs = new FileStream(...))
{
    using (TextWriter tw = new StreamWriter(fs))
    {
       // do stuff
    }
}

И вообще избегайте этой проблемы. Но я не знаю, что делать в таких условиях. Я закрываю tw, fs или оба?

Кроме того, в более общем плане: Если я собираю несколько потоков вместе, например, C (B (A)), могу ли я вызвать Close / Dispose на C, а затем не беспокоиться о необходимости вызова его на B и A?

Ответы [ 3 ]

4 голосов
/ 24 апреля 2011

Вам нужно только закрыть StreamWriter.

Из документации метода StreamWriter.Close:

Закрывает текущий объект StreamWriter и нижележащий поток.

Также примечательно в документации метода:

Эта реализация Close вызывает метод Dispose, передающий истинное значение.

Это означает, чтозакрытие и удаление StreamWriter эквивалентны.Вам не нужно утилизировать объект после его закрытия или закрывать его перед утилизацией.Метод FileStream.Close делает то же самое, поэтому закрытие или удаление StreamWriter также приведет к удалению потока.

Если вы не сможете найти такую ​​информацию для класса, вы всегда можете утилизировать обаписатель и поток, чтобы быть в безопасности.Удаление объекта, который уже был удален, не вызывает никаких проблем, и метод просто ничего не делает.Просто убедитесь, что вы закрыли их в правильном порядке, то есть закроете программу записи перед потоком.

1 голос
/ 24 апреля 2011

Поскольку вы уже вложили свое потоковое объявление в оператор использования, вы не должны конкретно либо .Использование вызовов dispose и dispose вызывает close.

См. Эту статью с SO

0 голосов
/ 24 апреля 2011

Вы в безопасности Dispose() и tw и fs. Если tw произойдет с Dispose() базовым потоком, повторный вызов Dispose() будет невозможен.

Обновление: Теперь я вижу реальный вопрос ... В вашем случае я бы обратился к ILSpy, который показывает, что TextWriter.Dispose() действительно вызывает Close() в базовом потоке. Так что вы можете просто позвонить tw.Dispose().

...