2009-03-26 10 views
0

Étant donné une méthoderefactoring question

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"}; 
    } 

et un code d'appel

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

Lorsque le contrôle passe de la directive à l'aide, est-il un problème qui xmlwriter n'a pas été explicitement fermée Foo (qui rendrait le flux inutile)?

En outre, passe un flux entre les méthodes peu recommandables, est-il un meilleur moyen de renvoyer les résultats de XMLWriting au code appelant (qui le zippera et le classera loin)?

Merci à l'avance, Greg

Répondre

4

Pas de problème ici. La méthode Dispose() d'un StreamWriter commence par appeler Flush() puis il supprime le flux sous-jacent, aussi longtemps que vous avez le couvert vous-même (ce que vous faites ci-dessus), il est OK de le laisser tant que le flux est actif.

Les autres réponses suggèrent de disposer de l'enregistreur lui-même, mais ce n'est pas vraiment une option ici, car il va également disposer le flux sous-jacent. Cela dit, si vous mettez simplement un document XML dans le flux et que vous l'utilisez ensuite, je préfère passer le document XML lui-même au lieu de suivre le flux. Mais peut-être que votre code n'est pas aussi simple que tout cela.

+0

Oui, bon point. –

+0

Quelles autres réponses :) LOL –

+0

J'ai choisi de ne pas passer le xmldocument parce que je pensais que je devais l'enregistrer avant de pouvoir le compresser avec ICSharpCode.SharpZipLib.Zip. Peut-être que c'est faux? –