为什么BinaryWriter会在处置时关闭外部流,以及如何防止这种情况发生?(.NET C#)

Jad*_*ias 30 .net c# stream binarywriter

我有一个方法接收使用BinaryWriter在其上写入的Stream.但是当我处理这个BinaryWriter时,它也会关闭流.我可以不妥协地把它留下来让我可以打开我的小溪吗?

Dav*_*nde 55

从.NET 4.5开始,BinaryWriter类有一个新的构造函数,它接受一个布尔参数来指示是否打开流.

参考:http://msdn.microsoft.com/en-us/library/gg712841.aspx

public BinaryWriter(
    Stream output,
    Encoding encoding,
    bool leaveOpen
)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 21

在这种情况下BinaryWriter,这不是一个直接选项(虽然一些流包装器允许您控制它,例如GZipStream等).

Jon在MiscUtil中有一个NonClosingStreamWrapper 应该可以工作:你将你的流包装在非关闭包装器中,然后给它包装BinaryWriter.这基本上是通过除Close()和之外的一切Dispose().

  • 当BinaryWriter关闭时,它会自动刷新**并告诉流关闭; 使用包装器,它仍然会冲洗自己.*stream*没有关闭的区别. (3认同)
  • 不,这与**BinaryWriter相关的**没有任何变化**; 它将值写入流并在流完成时告诉流.注意扩展您的想法?当然,你没有处理IDisisable的东西,因为你偷看了实现并决定推翻它...... (2认同)

Mik*_*liy 9

只是不要调用Dispose,而是使用Flush,它的安全.

  • "对象是一次性的事实并不需要调用处理" - 我们再次不同意.IDisposable是合同; 除非你有充分的理由,否则你应该在完成后处理它.其他任何东西打破了封装.你应该不知道或不关心它需要的东西......它是一次性的:处理它.回复你的其他评论(在我的帖子上). (6认同)
  • 这是安全_today_.你是否会在.NET版本上使用Reflector以确保它继续安全?这不是解决方案.-1. (5认同)
  • 它总是安全的.仅仅因为作家的语义.想想为什么它现在已经处理了(提示看看msdn上的例子).另请注意,这不是.NET中唯一错误使用IDisposable的地方,例如熟知WCF通道的Dispose问题. (2认同)
  • 幸运的是,`BinaryWriter`并不像`FileStream`那样在`Finalize`中调用`Dispose`.这种行为意味着`BinaryWriter.Dispose`是可选的. (2认同)

Ken*_* K. 9

受保护的BinaryWriter.Dispose(bool)方法是虚拟的,它所做的就是关闭流(您可以在Reflector中检查它是否为真). - 这个方法由Dispose()方法调用.

你可以简单地从BinaryWriter继承一个类,并覆盖Dispose(bool)方法,什么也不做,或者别的什么.