C# · 12月 24, 2021

c# – 为什么流处理时,它的作者被处置?

请考虑以下代码: using (var ms = new MemoryStream()){ using(var writer = BinaryWriter(ms)) { writer.Write(/*something*/); writer.Flush(); } Assert.That(ms.Length > 0); // Throws ObjectDisposedException}

一方面,一次性物品应该处置它的资源;我得到了,但另一方面,对象没有创建,并且不拥有这个资源,它提供了 – >调用代码应该负责…不?

我不能想到这样的其他情况,但是在任何接收一次性物品的类的框架中它是否符合自己处置的一致性模式?

解决方法 有一个隐含的假设,你每个流只能有一个作者,所以作者为了方便而承担了流的所有权 – 然后你有一件事要清理.

但我同意这并不总是真的,而且经常不方便.一些实现(例如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);}