为什么我们在 C# 中使用嵌套的 using 语句?

why we use nested using statement in c#?

提问人:Prakash sekar 提问时间:12/12/2022 最后编辑:nvoigtPrakash sekar 更新时间:12/12/2022 访问量:87

问:

using (StreamReader outFile = new StreamReader(outputFile.OpenRead())) 
{    
   StreamReader resFile = new StreamReader(resultFile.OpenRead())    
   {       //Some Codes    }
}

为什么上面的 resFile 对象没有自动关闭?

我也在 using 语句中编写了 resFile 对象。请解释一下该声明。using

使用 using-statement 的 C#

评论


答:

2赞 Mark Cilia Vincenti 12/12/2022 #1

您没有使用嵌套使用。只有一个 using 语句。

嵌套使用示例:

using (...)
{
     using (...)
     {
         ...
     }
}

您可能希望使用嵌套使用的原因是,您有多个需要释放的声明。

评论

0赞 Prakash sekar 12/12/2022
这意味着每个声明都应该有一个 using 语句,然后只处理它。否则,它不会自动处理,即使我们在 using 块中声明它。对吗?
0赞 Mark Cilia Vincenti 12/12/2022
一旦 using 语句超出范围,将立即调用该方法。Dispose()
1赞 Thomas Voß 12/12/2022 #2

在此处找到 using 语句的官方解释:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

在您的示例中,您没有嵌套的 using 语句,正如 Mark 在他的回答中正确指出的那样。(尽管您应该对 resFile Streamreader 进行第二次使用。

如果你想在 “Some Codes” 部分同时使用两个流读取器,它们必须是嵌套的,因为 outFile 和 resFile 的实例只能在大括号内使用。

从 C#8 开始,使用“避免”嵌套的新可能性。请参见:https://learn.microsoft.com/de-de/dotnet/csharp/language-reference/proposals/csharp-8.0/using

0赞 knittl 12/12/2022 #3

使用是语法糖,基本上编译为以下内容:

官方代码:

using (var a = b)
{    
  c();
  d();
}

脱糖代码:

{
  var a;
  try {
    a = b;
    c();
    d();
  } finally {
    if (a != null) {
      ((IDisposable)a).Dispose();
    }
  }
}