вопрос о рефакторинге
-
22-08-2019 - |
Вопрос
Дан метод
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-документ вместо того, чтобы отслеживать поток.Но, возможно, ваш код не так прост, как все это.