加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:21:54 所属栏目:百科 来源:网络整理
导读:请考虑以下代码: using (var ms = new MemoryStream()){ using(var writer = BinaryWriter(ms)) { writer.Write(/*something*/); writer.Flush(); } Assert.That(ms.Length 0); // Throws ObjectDisposedException} 一方面,一次性物品应该处置它的资源;我得
请考虑以下代码:
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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读