处理streamreader会关闭流吗?我正在向要写入的方法发送一个流,在这些方法中我使用的是二进制阅读器/ wrtier。当读取器/写入器被处理时,using或者仅在未被引用时,流也被关闭?我会发送一个BinaryReader / Writer,但我也在使用StreamReader(也许我应该绕过它。我只使用GetLine和ReadLine)。如果每次作家/读者关闭时关闭流,这是非常麻烦的。
3 回答
哆啦的时光机
TA贡献1779条经验 获得超6个赞
是的,StreamReader
,StreamWriter
,BinaryReader
和BinaryWriter
所有关闭/处置其底层流时,你叫Dispose
他们。如果读者/作者只是垃圾收集,他们不处理流 - 你应该总是处理读者/作者,最好是using
声明。(事实上,这些类都没有终结器,也没有。)
就个人而言,我更喜欢使用流的using语句。你可以using
非常巧妙地嵌套没有大括号的语句:
using (Stream stream = ...)using (StreamReader reader = new StreamReader(stream, Encoding.Whatever)){}
即使using
流的语句有点多余(除非StreamReader
构造函数抛出异常),我认为这是最佳实践,如果你摆脱它StreamReader
并且只是在以后直接使用流,你就已经有了正确的处置语义。
动漫人物
TA贡献1815条经验 获得超10个赞
这是一个旧的,但我想今天做类似的事情,发现事情已经发生了变化。从.net 4.5开始,有一个leaveOpen
论点:
public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen )
唯一的问题是,为其他参数设置的内容并不完全明显。这是一些帮助:
从StreamReader构造函数(Stream)的msdn页面:
此构造函数将编码初始化为UTF8Encoding,使用stream参数将BaseStream属性初始化,并将内部缓冲区大小初始化为1024字节。
这只是叶detectEncodingFromByteOrderMarks
其判断的源代码是true
public StreamReader(Stream stream) : this(stream, true) {}public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks) : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {}
如果暴露了一些默认值或者参数是可选的,那么我们就可以指定我们想要的那些默认值。
慕村225694
TA贡献1880条经验 获得超4个赞
是的,它确实。您可以通过使用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); } }}
- 3 回答
- 0 关注
- 936 浏览
添加回答
举报
0/150
提交
取消