如果在“using”块内发生异常,是否会调用Dispose方法?

8
在C#中,如果在“using”块内发生异常,Dispose方法是否会被调用?

2
是的。 - L.B
https://dev59.com/BWgu5IYBdhLWcg3w6bOo#10984354 - Brian Warshaw
2
当您输入关键字 c# using dispose exception 时,谷歌会返回什么? - I4V
@Brij 不,第一个结果就是你的答案 - L.B
1
@Brij 你应该意识到,尽管这些问题来自“StackOverflow”,但通常都会得到回答。 - poke
@poke,是的,StackOverflow上的问题已经被回答了。 - Brij
1个回答

23

是的,它会被调用。

using 转换为 try-finally 块,因此即使出现可恢复的异常,Dispose 也会被调用。

参见:C# using 语句

使用 using 语句可以确保在调用对象方法时发生异常时仍会调用 Dispose 方法。您可以通过将对象放入 try 块中并在 finally 块中调用 Dispose 来实现相同的结果;实际上,这就是编译器如何将 using 语句转换的方式。

考虑实现了 IDisposable 接口的 SqlConnection,因此以下代码:

using (SqlConnection conn = new SqlConnection("connectionstring"))
{
    //some work
}

将被翻译为

{
    SqlConnection conn = new SqlConnection("connectionstring");
    try
    {
        //somework
    }
    finally
    {
        if (conn != null)
            ((IDisposable)conn).Dispose(); //conn.Dispose();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接