C# 如果我需要保留“二进制读取器”,是否应该处置该读取器;包装的;流动

C# 如果我需要保留“二进制读取器”,是否应该处置该读取器;包装的;流动,c#,.net,stream,dispose,C#,.net,Stream,Dispose,BinaryReader都需要流参数。如果我需要在使用完BinaryReader后保持底层流的原样,我是否仍应该调用它的Dispose()?如果没有,对于不再需要的BinaryReader,是否有其他清理 我这样问是因为我找不到一个明确的答案 小附加值 在我的上下文中,我使用BinaryReader读取几个字节,然后将流的位置设置回初始化BinaryReader之前的位置 另外,我使用的是.NET4。不,如果您想保持流的打开状态,可以不处理BinaryReader 不过,我可能会添加一条注释来解

BinaryReader
都需要流参数。如果我需要在使用完
BinaryReader
后保持底层流的原样,我是否仍应该调用它的
Dispose()
?如果没有,对于不再需要的
BinaryReader
,是否有其他清理

我这样问是因为我找不到一个明确的答案

小附加值

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


另外,我使用的是.NET4。

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

不过,我可能会添加一条注释来解释发生了什么-我不确定是否可以保证
BinaryReader
只从流中读取您从
BinaryReader
读取的内容。。。例如,它可能会在缓冲区中读取更多内容。显然,如果您在流上搜索,这不是问题。

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

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

newutf8encoding
是默认值,如果您使用了BinaryReader(流)构造函数,如果您不需要UTF8Encoding,可以使用其他方法。
true
表示“是的,让流保持打开状态”。

如果是我,我会处理BinaryReader,只是为了整洁……但我也会确保我用以下内容创建了
BinaryReader

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


走这条路,你要明确事物的范围和所有权。这样就减少了困惑和误解的空间。

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

  • 如果您使用的是.NET4.5,那么应该使用BinaryReader的3-arg构造函数。完成了
  • 如果您使用的是.NET3.5/4.0,则需要不同的解决方案
  • Jon Skeet(公认的答案)建议永远不要处理二进制读取器。当然,这是可行的,但可能会引起混乱

    另一种解决方案是在将流传递给BinaryReader之前,将流包装在非ClosingStreamRapper中。BinaryReader将在释放包装器时关闭包装器,但NonClosingStreamRapper不会释放底层流。您仍然可以在binaryStream上使用.Dispose(或者更好,使用模式)

    非常讽刺的是,@JonSkeet已经创建了一个非闭合流说唱程序来实现这一点。这是他的一部分。(但请注意许可证)


    是的,我更新了我的问题,提到我用
    BinaryReader
    只读了几个字节。我100%同意你的评论,如果我使用4.5,我可能不会问这个问题,因为我可能会注意到
    leaveOpen
    参数。
    public BinaryReader(
      Stream   input,
      Encoding encoding,
      bool     leaveOpen
      )
    
    using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream)))
    {
    //...
    }