StreamReader и удаление - PullRequest
       35

StreamReader и удаление

3 голосов
/ 28 марта 2011

У меня есть метод, который принимает Stream в качестве параметра:

public void Method(Stream stream)
{
...
}

В этом методе я создаю StreamReader. Должен ли я включить использование StreamReader в использовании оператора? Если это так, поток будет удален, что неверно. Какова лучшая практика использования Stream и StreamReader в этом случае?

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Нет - в этом случае вызывающая сторона выполняет удаление.

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

В таких случаях я склонен писать что-то вроде этого и конец метода:

streamWriter.Flush(); // Only for writers, not for readers
streamWriter = null; // Show myself and other coders that lack of Dispose is not a mistake but it's intented

Этот подход - то, что я использую для потоковых декораторов, которые всегда располагают лежащие в основе потоки, стоит отметить, чтов некоторых случаях (например - DeflateStream) вам необходимо вызвать .Dispose(), но в таких случаях потоковые декораторы позволяют вам выбирать, хотите ли вы, чтобы они закрывали основной поток или нет.Это может выглядеть так:

DeflateStream deflateStream = new DeflateStream(fileReader.BaseStream, CompressionMode.Decompress, true);
BinaryReader deflateReader = new BinaryReader(deflateStream);
var articleText = deflateReader.ReadString();
deflateReader = null;
deflateStream.Close();
deflateStream.Dispose();
deflateStream = null;
2 голосов
/ 28 марта 2011

Вызов Dispose на StreamReader избавит от базового Stream.Если это то, что вам нужно, то оберните StreamReader в конструкцию using.В противном случае просто создайте StreamReader и оставьте его для очистки сборщика мусора.

Другими словами, это зависит от того, является ли ваша функция «берущей на себя ответственность» Stream.

...