如果我需要保留"wrapped"流,我应该释放二进制阅读器吗?



两个BinaryReader构造函数都需要一个流参数。如果在处理完BinaryReader后,我需要保持底层流的原样,我是否还应该调用它的Dispose()?如果没有,是否对不再需要的BinaryReader进行其他清理?

我这么问是因为我在MSDN页面上找不到BinaryReader.Dispose()的明确答案。

小加法

在我的上下文中,我使用BinaryReader读取几个字节,然后将流的位置设置回BinaryReader初始化之前的位置。

此外,我正在使用.Net 4。

如果您(或其他阅读这些文章寻找答案的人)正在使用带有.NET 4.5(或更高版本)的VS 2012,则可以创建一个不会关闭流的BinaryReader。例如:

using(var reader = new BinaryReader(theStream, new UTF8Encoding(), true)
{
//...
}

如果使用BinaryReader(Stream)构造函数,则默认为new UTF8Encoding;如果不需要UTF8Encoding,则可以使用其他方法。true表示"是,保持流打开"。

不,如果您想保持流的打开,那么不处理BinaryReader是可以的。

不过,我可能会添加一条评论来解释发生了什么——我不确定是否保证BinaryReader只会像你从BinaryReader中读取的那样从流中读取。。。例如,它可能已经向缓冲区中读取了更多内容。显然,如果你在流上搜索,这不是问题。

已经有了一个公认的答案,但它让我感到肮脏:-)我认为我们可以做得更好:

  1. 如果您使用的是.NET 4.5,则应该使用BinaryReader的3-arg构造函数。完成
  2. 如果您使用的是.NET 3.5/4.0,则需要不同的解决方案

Jon Skeet(公认的答案)建议永远不要处理BinaryReader。好吧,这当然有效,但可能会引起混乱。

另一种解决方案可以是在将流传递给BinaryReader之前,将其包装在NonClosingStreamWrapper中。BinaryReader将在包装被处理时关闭包装,但NonClosingStreamWrapper不会处理底层Stream。您仍然可以在binaryStream上使用.Dispose(或者更好的是,使用模式)。

具有讽刺意味的是,@JonSkeet已经创建了一个NonClosingStreamWrapper来实现这一点。这是他杂用图书馆的一部分。(但请注意许可证)

using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream)))
{
//...
}

如果是我,我会丢弃BinaryReader,只是为了整洁。。。但我也要确保我用这个构造函数重载创建了BinaryReader

public BinaryReader(
  Stream   input,
  Encoding encoding,
  bool     leaveOpen
  )

其中将CCD_ 15自变量指定为CCD_。

走这条路,你会明确事物的范围和所有权。这样可以减少混乱和误解的空间。

最新更新