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)))
{
//...
}