我在 MSDN 文档中看到了以下示例代码,演示了如何使用 System.IO.StreamReader
类从 System.IO.FileStream< 读取 UTF-8 文本
对象。这两个嵌套的 using
语句让我觉得是多余的——肯定是在其中一个对象上调用 Dispose()
就可以解决问题,并正确释放文件句柄? (来源:http://msdn.microsoft.com/en-us/library/yhfzs7at.aspx)
using (FileStream fs = new FileStream(path, FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs))
{
while (sr.Peek() >= 0)
{
Console.WriteLine(sr.ReadLine());
}
}
}
用以下方式重写该代码不是更简单且同样正确吗?
using (FileStream fs = new FileStream(path, FileMode.Open))
{
StreamReader sr = new StreamReader(fs);
while (sr.Peek() >= 0)
{
Console.WriteLine(sr.ReadLine());
}
}
最佳答案
根据文档,The StreamReader object calls Dispose() on the provided Stream object when StreamReader.Dispose is called .这意味着使用
StreamReader
保证处理底层Stream
。反之亦然:仅处理 Stream
不 就足够了 - StreamReader
可能正在分配其他 native 资源。所以第二个样本不正确。
(仅使用
StreamReader
不涵盖 StreamReader
构造函数可能抛出的情况。为了涵盖这种情况,需要使用
。因为它只抛出不可读或 null
流,所以这可能不相关。)
一般来说,您应该始终处置每个一次性元素。它是 IDisposable
协定的一部分,多次处置一个对象并没有什么坏处,而且这样做的开销很低。
关于C# - 嵌套的 using 语句是否多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827072/