вопрос рефакторинга - PullRequest
0 голосов
/ 27 марта 2009

Учитывая метод

    public static string[] Foo(System.IO.Stream stream)
    {
        XmlTextWriter xmlWriter = new XmlTextWriter(stream,   System.Text.Encoding.ASCII);

        xmlWriter.WriteStartDocument();
        xmlWriter.WriteStartElement("Element");
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndDocument();
        xmlWriter.Flush();

        return new string[3]{"1", "2", "3"};
    }

и телефонный код

using(MemoryStream memStream = new MemoryStream())
{
     string[] playerIDs = PlayerCommand.Foo(stream);
     // do some stuff with stream and playerIDs
}

Когда элемент управления выходит из директивы using, есть ли проблема, что xmlWriter не был явно закрыт в Foo (что сделало бы поток бесполезным)?

Кроме того, передача потока между методами нежелательна, есть ли лучший способ передать результаты XMLWriting обратно в вызывающий код (который заархивирует его и сохранит)?

Спасибо заранее, Грег

1 Ответ

4 голосов
/ 27 марта 2009

Нет проблем здесь. Метод Dispose() StreamWriter в основном сначала вызывает Flush(), а затем удаляет базовый поток, так что, пока вы покрываете Flush() (что вы делаете выше), можно оставить его в покое, пока поток жив.

Другие ответы предлагают избавиться от самого Writer, но на самом деле это не вариант здесь, потому что он также удалит основной поток.

Тем не менее, если вы просто помещаете XML-документ в поток и затем используете его позже, я бы предпочел пропустить сам XML-документ, а не отслеживать поток. Но, возможно, ваш код не так прост, как все это.

...