configurationStreamReader是否closuresstream?

我正在发送一个stream来写入方法,在这些方法中,我正在使用二进制读取器/ wier。 当读者/写者得到处置时,无论是通过using还是只是当它没有被引用时,stream是否closures?

我会发送一个BinaryReader / Writer,但我也使用StreamReader(也许我应该绕过,我只用于GetLine和ReadLine)。 如果每次作家/读者closures时closuresstream,这是相当麻烦的。

是的, StreamReaderStreamWriterBinaryReaderBinaryWriter都会在您调用Dispose时closures/处理其基础stream。 如果读者/作者只是垃圾收集,他们不会处理stream – 你应该总是处理读者/作者,最好是using声明。 (实际上,这些课程都没有确定者,也不应该有。)

就我个人而言,我更喜欢为stream使用一个使用语句。 你可以非常整齐地using没有大括号的语句嵌套:

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

即使stream的using语句有点多余(除非StreamReader构造函数抛出exception),我认为这是最好的实践,因为如果你摆脱了StreamReader ,直接在以后使用stream,你已经有了正确的处置语义。

这是一个古老的,但我想今天做类似的事情,发现事情已经改变。 从.net 4.5开始,有一个leaveOpen参数:

 public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen ) 

唯一的问题是,为其他参数设置的内容并不十分明显。 这里有一些帮助:

从StreamReader构造函数(Stream) 的msdn页面

此构造函数将编码初始化为UTF8Encoding,使用stream参数的BaseStream属性以及内部缓冲区大小为1024字节。

那只剩下由源代码判断为true detectEncodingFromByteOrderMarks

 public StreamReader(Stream stream) : this(stream, true) { } public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks) : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) { } 

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

是的,它确实。 您可以通过使用Reflector查看实现来validation这一点。

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

六年后,但也许这可能有助于某人。

StreamReader在处理时会closures连接。 然而,在StreamReader / StreamWriter中使用(Stream stream = …){…}“可能导致Stream被丢弃两次:(1)当StreamReader对象被丢弃(2)时,并且Stream using块closures。 运行VS的代码分析时会导致CA2202警告。

直接从CA2202页面获得的另一个解决scheme是使用try / finally块。 正确设置,这将只closures连接一次。

在CA2202的底部附近,Microsoftbuild议使用以下内容:

 Stream stream = null; try { stream = new FileStream("file.txt", FileMode.OpenOrCreate); using (StreamWriter writer = new StreamWriter(stream)) { stream = null; // Use the writer object... } } finally { if(stream != null) stream.Dispose(); } 

代替…

 // Generates a CA2202 warning using (Stream stream = new FileStream("file.txt", FileMode.Open)) using (XmlReader reader = new XmlReader (stream)) { // Use the reader object... } 

是。 调用Dispose()和IDisposable(“使用”)应该使对象清理所有的资源。 这包括刷新和closures文件描述符。

如果你想将它传递给其他方法,那么你需要确保这些方法不会在使用块中进行读/写操作。

一个简单的方法来解决这个问题,如果你需要重写StreamWriter类的Dispose方法。 看到我的post在这里的代码如何做到这一点:

是否.Disposing StreamWriterclosures基础stream?

通过“使用”关键字或调用明确地处置stream