处理streamreader会关闭流吗?

处理streamreader会关闭流吗?

我正在向要写入的方法发送一个流,在这些方法中我使用的是二进制阅读器/ wrtier。当读取器/写入器被处理时,using或者仅在未被引用时,流也被关闭?

我会发送一个BinaryReader / Writer,但我也在使用StreamReader(也许我应该绕过它。我只使用GetLine和ReadLine)。如果每次作家/读者关闭时关闭流,这是非常麻烦的。


茅侃侃
浏览 892回答 3
3回答

哆啦的时光机

是的,StreamReader,StreamWriter,BinaryReader和BinaryWriter所有关闭/处置其底层流时,你叫Dispose他们。如果读者/作者只是垃圾收集,他们不处理流 - 你应该总是处理读者/作者,最好是using声明。(事实上,这些类都没有终结器,也没有。)就个人而言,我更喜欢使用流的using语句。你可以using非常巧妙地嵌套没有大括号的语句:using (Stream stream = ...)using (StreamReader reader = new StreamReader(stream, Encoding.Whatever)){}即使using流的语句有点多余(除非StreamReader构造函数抛出异常),我认为这是最佳实践,如果你摆脱它StreamReader并且只是在以后直接使用流,你就已经有了正确的处置语义。

动漫人物

这是一个旧的,但我想今天做类似的事情,发现事情已经发生了变化。从.net 4.5开始,有一个leaveOpen论点:public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen )唯一的问题是,为其他参数设置的内容并不完全明显。这是一些帮助:从StreamReader构造函数(Stream)的msdn页面:此构造函数将编码初始化为UTF8Encoding,使用stream参数将BaseStream属性初始化,并将内部缓冲区大小初始化为1024字节。这只是叶detectEncodingFromByteOrderMarks其判断的源代码是truepublic StreamReader(Stream stream)         : this(stream, true) {}public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)         : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {}如果暴露了一些默认值或者参数是可选的,那么我们就可以指定我们想要的那些默认值。

慕村225694

是的,它确实。您可以通过使用Reflector查看实现来验证这一点。protected override void Dispose(bool disposing){     try     {         if ((this.Closable && disposing) && (this.stream != null))         {             this.stream.Close();         }     }     finally     {         if (this.Closable && (this.stream != null))         {                 this.stream = null;                 this.encoding = null;             this.decoder = null;             this.byteBuffer = null;             this.charBuffer = null;             this.charPos = 0;             this.charLen = 0;             base.Dispose(disposing);         }     }}
打开App,查看更多内容
随时随地看视频慕课网APP