处理作者时为什么要处理流?

Ste*_*ers 9 c# dispose stream .net-4.0

请考虑以下代码:

using (var ms = new MemoryStream())
{
    using(var writer = BinaryWriter(ms))
    {
        writer.Write(/*something*/);
        writer.Flush();
    }

    Assert.That(ms.Length > 0); // Throws ObjectDisposedException
}
Run Code Online (Sandbox Code Playgroud)

一方面,一次性物品应该处理它的资源; 我明白了,但另一方面,对象没有创建并且没有拥有这个资源,它提供了 - >调用代码应该对它负责......不是吗?

我想不出像这样的任何其他情况,但是对于任何接收一次性物品的类来自行处理它们的框架中它是否是一致的模式?

Mar*_*ell 13

有一个隐含的假设,即每个流只有一个编写器,因此为了方便起见,编写者假定了流的所有权 - 然后你需要清理一件事.

但我同意; 这并非总是如此,而且往往不方便.某些实现(例如DeflateStream,GZipStream)允许您选择.否则,唯一真正的选择是在编写器和底层流之间注入虚拟流; IIRC在Jon Skeet的"MiscUtil"库中有一个NonClosingStreamWrapper就是这样做的:http://www.yoda.arachsys.com/csharp/miscutil/

用法如下:

using (var ms = new MemoryStream())
{
    using(var noClose = new NonClosingStreamWrapper(ms))
    using(var writer = BinaryWriter(noClose))
    {
        writer.Write(/*something*/);
        writer.Flush();
    }

    Assert.That(ms.Length > 0);
}
Run Code Online (Sandbox Code Playgroud)