web-dev-qa-db-fra.com

Dois-je faire StreamWriter.flush ()?

Supposons ce code C #:

using (MemoryStream stream = new MemoryStream())
{
    StreamWriter normalWriter = new StreamWriter(stream);
    BinaryWriter binaryWriter = new BinaryWriter(stream);

    foreach(...)
    {
        binaryWriter.Write(number);
        normalWriter.WriteLine(name); //<~~ easier to reader afterward.
    }

    return MemoryStream.ToArray();
}

Mes questions sont:

  1. Dois-je utiliser un affleurement à l'intérieur de la boucle pour préserver l'ordre?
  2. Est-ce que retourner MemoryStream.ToArray() est légal? En utilisant le bloc using- comme convention, je crains que cela ne gâche tout.
27
Nefzen

Grattez la réponse précédente - je n'avais pas remarqué que vous utilisiez deux wrappers autour du même flux. Cela me semble un peu risqué.

Quoi qu'il en soit, je mettrais les StreamWriter et BinaryWriter dans leurs propres blocs using.

Oh, et oui, il est légal d'appeler ToArray() sur la MemoryStream - les données sont conservées même après leur suppression.

Si vous voulez vraiment utiliser les deux wrappers, je le ferais comme ceci:

using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter normalWriter = new StreamWriter(stream))
    using (BinaryWriter binaryWriter = new BinaryWriter(stream))
    {
        foreach(...)
        {
            binaryWriter.Write(number);
            binaryWriter.Flush();
            normalWriter.WriteLine(name); //<~~ easier to read afterward.
            normalWriter.Flush();
        }
    }    
    return MemoryStream.ToArray();
}

Je dois dire que je suis toutefois un peu méfiant quant à l'utilisation de deux wrappers dans le même flux. Vous devrez continuer à vider chacun d'eux après chaque opération pour vous assurer de ne pas vous retrouver avec des données impaires. Vous pouvez définir la StreamWriter 's AutoFlush property sur true pour atténuer la situation, et I croire que BinaryWriter ne le fait pas en fait nécessite un vidage (c.-à-d. données), mais il est risqué de s’en remettre à cela.

Si vous devez mélanger des données binaires et textuelles, j'utiliserais une BinaryWriter et écrirais explicitement les octets de la chaîne, en le récupérant avec Encoding.GetBytes(string).

24
Jon Skeet

Mettre à jour

Peu importe cette réponse, je me suis confondu avec les écrivains ...


  1. Non, la commande sera préservée ( update: peut-être pas). Flush est utile/nécessaire dans d'autres situations, bien que je ne me souvienne plus quand.
  2. Je pense que oui, using fait en sorte que tout soit bien rangé.
0
mbillard