为了账号安全,请及时绑定邮箱和手机立即绑定

处理streamreader会关闭流吗?

处理streamreader会关闭流吗?

C#
茅侃侃 2019-08-17 15:28:51
处理streamreader会关闭流吗?我正在向要写入的方法发送一个流,在这些方法中我使用的是二进制阅读器/ wrtier。当读取器/写入器被处理时,using或者仅在未被引用时,流也被关闭?我会发送一个BinaryReader / Writer,但我也在使用StreamReader(也许我应该绕过它。我只使用GetLine和ReadLine)。如果每次作家/读者关闭时关闭流,这是非常麻烦的。
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

是的,StreamReaderStreamWriterBinaryReaderBinaryWriter所有关闭/处置其底层流时,你叫Dispose他们。如果读者/作者只是垃圾收集,他们处理流 - 你应该总是处理读者/作者,最好是using声明。(事实上,这些类都没有终结器,也没有。)

就个人而言,我更喜欢使用流的using语句。你可以using非常巧妙地嵌套没有大括号的语句:

using (Stream stream = ...)using (StreamReader reader = new StreamReader(stream, Encoding.Whatever)){}

即使using流的语句有点多余(除非StreamReader构造函数抛出异常),我认为这是最佳实践,如果你摆脱它StreamReader并且只是在以后直接使用流,你就已经有了正确的处置语义。


查看完整回答
反对 回复 2019-08-17
?
动漫人物

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

如果暴露了一些默认值或者参数是可选的,那么我们就可以指定我们想要的那些默认值。


查看完整回答
反对 回复 2019-08-17
?
慕村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);
        }
    }}


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 889 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信