C#-使用冗余语句嵌套?

C#-使用冗余语句嵌套?,c#,filestream,dispose,streamreader,using,C#,Filestream,Dispose,Streamreader,Using,我在MSDN文档中遇到了以下示例代码,演示了如何使用System.IO.StreamReader类从System.IO.FileStream对象中读取UTF-8文本。两个嵌套的using语句给我的印象是多余的-对其中一个对象调用Dispose()肯定会起作用,并正确地释放文件句柄?(来源:) 用下面的方法重写代码不是更简单,也同样正确吗 using (FileStream fs = new FileStream(path, FileMode.Open)) { StreamReader

我在MSDN文档中遇到了以下示例代码,演示了如何使用
System.IO.StreamReader
类从
System.IO.FileStream
对象中读取UTF-8文本。两个嵌套的
using
语句给我的印象是多余的-对其中一个对象调用
Dispose()
肯定会起作用,并正确地释放文件句柄?(来源:)

用下面的方法重写代码不是更简单,也同样正确吗

using (FileStream fs = new FileStream(path, FileMode.Open)) 
{
    StreamReader sr = new StreamReader(fs);

    while (sr.Peek() >= 0) 
    {
        Console.WriteLine(sr.ReadLine());
    }
}

根据文件。这意味着
使用
StreamReader
可以保证底层
流的处置。反之亦然:仅处理
是不够的,流阅读器可能正在分配其他本机资源。所以第二个样本是不正确的

使用
StreamReader
不包括
StreamReader
构造函数可以抛出的情况。要涵盖这种情况,需要使用
两种情况。因为它只针对不可读或
null
流抛出,但这可能并不相关。)


一般来说,您应该始终在每个一次性物品上进行处理。多次处置一个对象不会造成伤害,而且这样做的开销很低,这是
IDisposable
合同的一部分。

第二个示例在原则上完全错误

它不会泄露任何信息,但这取决于这样一种认识:StreamReader没有自己的资源,实际上不需要处理,即使它是可识别的

周围使用(){}
的单个
在这里或多或少是正确的,这是基于读者将关闭其流的已记录(并受到批评)功能


这里的最佳实践是使用2个using stations。注意它们非常便宜,您只需要代码一致性。

我认为处置所有实现
IDisposable
的工具是个好主意。类似的问题有很好的答案:您的引用是正确的,但与第二个代码示例无关。@Henkholtman我还说第二个示例正是出于这个原因不正确。请注意
StreamReader
还提供了一个选项,可以说不要关闭底层流。另外,仅在
StreamReader
中使用语句是一个问题,当其构造函数抛出时,
FileStream
将不会关闭。@SriramSakthivel-从Fx 4.5开始,是的。但这不是这里使用的cotor。是的,我补充说有一个选项可以让流保持开放。顺便说一句,我编辑了我之前的评论,指出围绕StreamReader的单一使用语句将是危险的。关于抛出的论点非常普遍,不适用于此代码片段。在这种情况下,我不会鼓励单一使用,但也不会指责它。
using (FileStream fs = new FileStream(path, FileMode.Open)) 
{
    StreamReader sr = new StreamReader(fs);

    while (sr.Peek() >= 0) 
    {
        Console.WriteLine(sr.ReadLine());
    }
}