2009-03-26 9 views
0

制御がusingディレクティブの外に通過すると、したXmlWriterが明示的にはFooに閉鎖されていなかった問題がある方法リファクタリングの質問

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 
} 

(これを考えますストリームを無駄にするでしょうか?)

また、ストリーム間でメソッドをやりとりしていますが、XMLWritingの結果を呼び出し元のコードに渡す方が良いですか?ここでは、事前に

おかげで、 グレッグ

答えて

4

問題ありません。 StreamWriterのDispose()メソッドは、基本的には最初にFlush()を呼び出してから、元のストリームを破棄します。Flush()を自分で扱っている限り(上で説明したように)、ストリームが生きている限り吊り下げても問題ありません。

その他の回答はWriter自体を処理することを提案していますが、それは基本的なストリームも同様に処理するため、ここでは実際にはオプションではありません。

XML文書をストリームに入れて後で使用する場合は、ストリームを追跡する代わりに、XML文書自体を渡すことをお勧めします。しかし、おそらくあなたのコードはそれほど単純ではありません。

+0

はい、良い点。 –

+0

何か他の答え:) LOL –

+0

私はICSharpCode.SharpZipLib.Zipでそれを圧縮する前に、私はそれを保存しなければならないと考えていたので、xmldocumentを渡しませんでした。おそらくこれは間違っていますか? –