在使用语句中引发exception时Dispose是否仍然被调用?

在下面的例子中,如果在using语句中抛出exception,连接是否会closures并处理?

 using (var conn = new SqlConnection("...")) { conn.Open(); // stuff happens here and exception is thrown... } 

我知道下面的代码将确保它,但我很好奇如何使用语句。

 var conn; try { conn = new SqlConnection("..."); conn.Open(); // stuff happens here and exception is thrown... } // catch it or let it bubble up finally { conn.Dispose(); } 

有关:

抛出exception时,确保SQL连接的正确方法是什么?

是的, using将代码包装在try / finally块中,如果存在, finally部分将调用Dispose() 。 但是,它不会直接调用Close() ,因为它只检查正在实现的IDisposable接口,因此会检查Dispose()方法。

也可以看看:

  • 拦截IDisposable.Dispose中的exception
  • 抛出exception时,确保SQL连接的正确方法是什么?
  • C#“使用”语法
  • C#USING关键字 – 何时何时不使用它?
  • '使用'语句与'最后尝试'
  • 什么是C#使用块,为什么我应该使用它?
  • 一次性使用模式
  • 结束使用closures打开的SQL连接

这是reflection器如何解码你的代码生成的IL:

 private static void Main(string [] args)
 {
     SqlConnection conn = new SqlConnection(“...”);
    尝试
     {
         conn.Open();
        做东西();
     }
    最后
     {
        如果(conn!= null)
         {
             conn.Dispose();
         }
     }
 }

所以答案是肯定的,它会closures连接

 做东西() 

抛出exception。