在使用语句中引发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。