我可以创建一个新的 BinaryWriter 并在 Stream 上写入,而该流已经被另一个 BinaryWriter 使用了吗?

我需要递归地写入一些数据,但我想避免将 BinaryWriter 作为参数传递给方法,因为我需要传递一个 Stream。因此,将在流上写入数据的每个方法可能需要创建自己的 BinaryWriter 实例。但我不知道这是否正确。目前,它在 FileStream 上运行良好,但我不知道它是否会导致用户计算机出现意外结果。

我写了一个简单的例子来说明我想要实现的目标。 BinaryWriter 的这种用法是错误的吗?

例子:

public Main()
{
    using (var ms = new MemoryStream())
    {
        // Write data on the stream.
        WriteData(ms);
    }
}

private void WriteData(Stream output)
{
    // Create and use a BinaryWriter to use only on this method.
    using (var bWriter = new BinaryWriter(output, Encoding.UTF8, true))
    {
        // Write some data using this BinaryWriter.
        bWriter.Write("example data string");
        // Send the stream to other method and write some more data there.
        WriteMoreData(output);
        // Write some more data using this BinaryWriter.
        bWriter.Write("another example data string");
    }
}

private void WriteMoreData(Stream output)
{
    // Create and use a BinaryWriter to use only on this method.
    using (var bWriter = new BinaryWriter(output, Encoding.Unicode, true))
    {
        // Write some data on this BinaryWriter.
        bWriter.Write("write even more example data here");
    }
}

最佳答案



它应该可以正常工作。 BinaryWriter 本身不缓冲,因此每个实例不会干扰其他实例写入的数据。您正在为 true 参数传递 leaveOpen,因此在处理每个实例时,它不会关闭底层流。

但在旁观者的眼中,“错误”在某种程度上是存在的。我会说最好通过 BinaryWriter
MemoryStream 没有缓冲,但其他类型有缓冲。 BinaryWriter 的每个实例在处理时都会刷新流。有些人可能认为这效率低下,因为它至少部分地否定了缓冲的好处。在这里不是问题,但可能不是最好的习惯。

此外,BinaryWriter 的每个实例都将为垃圾收集器创建额外的工作。如果真的只有几个,那可能不是问题。但是,如果实际示例涉及更多调用,则可能会开始引起注意,尤其是当底层流是 MemoryStream 时(即您没有处理一些慢速设备 I/O)。

更重要的是,我没有看到在同一流上使用多个 BinaryWriter 实例的任何明显优势。看起来自然的、可读的、易于维护的事情是创建一个 BinaryWriter 并重用它,直到你完成编写。

为什么要避免将其作为参数传递?您已经通过了 Stream 。只需传递 BinaryWriter 即可。如果您确实需要直接访问底层流,它始终可以通过 BinaryWriter.BaseStream 获得。

底线:我不能说你的提议本身有任何明显的错误。但它与正常惯例的偏差(对我来说,无论如何)没有明显的好处。如果你有一个很好的理由来这样做,它应该有效。但我建议反对它。

关于c# - 我可以在同一个流上使用多个 BinaryWriters 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39156993/

10-12 01:24