11

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

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

小补充

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

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

4

4 回答 4

17

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

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

new UTF8Encoding如果您使用 BinaryReader(Stream) 构造函数,则为默认值,如果您不想要 UTF8Encoding,则可以使用其他内容。表示“是的true,让流保持打开状态”。

于 2012-08-29T16:34:55.860 回答
11

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

我可能会添加一条评论来解释正在发生的事情 - 而且我不确定是否保证只会从流中BinaryReader读取,只要你从BinaryReader......它可能已经读到更多例如缓冲区。显然,如果您随后在流上搜索,这不是问题。

于 2012-08-29T16:15:10.377 回答
4

已经有一个公认的答案,但这让我觉得很脏:-)我认为我们可以做得更好:

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

Jon Skeet(接受的答案)建议永远不要丢弃 BinaryReader。好吧,这当然可行,但可能会引起混乱。

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

非常讽刺的是,@JonSkeet 已经创建了一个 NonClosingStreamWrapper 来做到这一点。这是他的miscutil library的一部分。(但请注意许可证)

using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream)))
{
//...
}
于 2014-04-16T07:33:10.153 回答
2

如果是我,我会处理 BinaryReader,只是为了整洁......但我也会确保我BinaryReader这个构造函数重载创建了:

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

其中将leaveOpen参数指定为true指示读取器保持底层流打开。

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

于 2012-08-29T16:35:05.657 回答