refatoração questão
-
22-08-2019 - |
Pergunta
Dado um método
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"};
}
e um código de chamada
using(MemoryStream memStream = new MemoryStream())
{
string[] playerIDs = PlayerCommand.Foo(stream);
// do some stuff with stream and playerIDs
}
Quando o controle passa para fora utilizando a directiva, há um problema que xmlWriter não foi explicitamente fechado em Foo (o que tornaria o fluxo inútil)?
Além disso, é passar uma corrente entre os métodos repugnantes, há uma maneira melhor para passar os resultados de XMLWriting volta para o código de chamada (que vai zip-lo e arquivá-la)?
Agradecemos antecipadamente, Greg
Solução
Não há problema aqui. método Dispose()
de um StreamWriter basicamente primeiras chamadas Flush()
e, em seguida, descarta o fluxo subjacente, por isso, enquanto você tem a Flush()
cobriu-se (o que você faz acima) não há problema em deixá-lo pendurado, enquanto a do fluxo vivo.
As outras respostas sugerem a eliminação do próprio escritor, mas isso não é realmente uma opção aqui, porque vai eliminar o fluxo subjacente também.
Dito isto, se você está apenas colocando um documento XML no fluxo e, em seguida, usá-lo mais tarde, eu prefiro passar o documento XML-se em torno ao invés de manter o controle do fluxo. Mas talvez seu código não é tão simples assim.