Вопрос

Дан метод

    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 обратно в вызывающий код (который заархивирует его и отправит в файл)?

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

Это было полезно?

Решение

Здесь нет проблем.Потоковый авторский Dispose() метод в основном сначала вызывает Flush() а затем удаляет базовый поток, так что до тех пор, пока у вас есть Flush() прикрывшись (что вы делаете выше), можно оставить это висеть, пока поток жив.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top