28

假设这个 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();
}

我的问题是:

  1. 我是否需要在循环内使用刷新来保持顺序?
  2. 回国MemoryStream.ToArray()合法吗?我使用using-block 作为约定,我担心它会搞砸。
4

2 回答 2

26

从上一个答案开始 - 我没有注意到您在同一个流周围使用了两个包装器。这对我来说有点冒险。

无论哪种方式,我都会将StreamWriterandBinaryWriter放在他们自己的using块中。

哦,是的,调用- 数据即使在处理后仍会保留是合法ToArray()的。MemoryStream

如果你真的想使用这两个包装器,我会这样做:

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();
}

我不得不说,我对在同一个流周围使用两个包装器有点警惕。您必须在每次操作后不断刷新它们,以确保您不会得到奇怪的数据。您可以将StreamWriter'AutoFlush属性设置为 true 以缓解这种情况,我相信目前实际上BinaryWriter不需要刷新(即它不缓冲任何数据),但依赖它会感觉有风险。

如果您必须混合二进制和文本数据,我会使用 aBinaryWriter并显式写入字符串的字节,并使用Encoding.GetBytes(string).

于 2009-06-29T16:18:54.713 回答
0

更新

没关系这个答案,我对作家感到困惑......


  1. 不,订单将被保留(更新:也许不会)。Flush 在其他情况下很有用/需要,但我不记得什么时候了。
  2. 我想是的,使用可以确保一切都很好地清理干净。
于 2009-06-29T16:20:23.667 回答