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