Question

Supposons que le 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 les suivantes:

  1. Ai-je besoin d'utiliser affleurant à l'intérieur du boucle pour préserver l'ordre?
  2. est de retour légal MemoryStream.ToArray()? J'utilisant le using -. Bloc comme une convention, je crains que cela va gâcher les choses
Était-ce utile?

La solution

Grattez la réponse précédente - Je ne l'avais pas remarqué que vous utilisiez deux emballages dans le même flux. Cela me sent un peu risqué.

De toute façon, je mettrais la et StreamWriter dans leurs propres BinaryWriter blocs using.

Oh, et oui, il est légal d'appeler au ToArray() MemoryStream -. Les données sont conservées même après qu'il est disposé à

Si vous voulez vraiment utiliser les deux emballages, 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, je suis un peu méfiant d'utiliser deux emballages dans le même flux que. Vous devrez garder le rinçage chacun d'eux après chaque opération pour vous assurer de ne pas se retrouver avec des données impaires. Vous pouvez définir AutoFlush rel="noreferrer"> Encoding.GetBytes(string) propriété sur true pour atténuer la situation, et je croire qui ne <=> pas actuellement en fait nécessitent le rinçage (il ne cache pas de données), mais se fondant sur qui se sent risqué.

Si vous devez mélanger des données binaires et texte, j'utiliser un et écrire explicitement <=> les octets pour la chaîne, l'extraction avec <=>.

Autres conseils

Mise à jour

Passons cette réponse, je me suis embrouillé avec les écrivains ...


  1. Non, l'ordre sera préservé ( Mise à jour: peut-être pas). Flush est utile / nécessaire dans d'autres situations, bien que je ne me souviens pas quand.
  2. Je pense que oui, avec assure que tout nettoie bien.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top