使用try catch语句.使用语句会发生什么?

CSh*_*ned 9 .net c# using-statement

如果我有一个围绕try catch语句的using块,那么using语句中的对象会发生什么情况?catch会触发异常吗?请考虑以下代码:

using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse())
{
    try
    {
        Foo();
    }
    catch (ArgumentNullException e)
    {
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们假设Foo()失败并且触发了异常并且有效地破坏了程序将处理databaseConnectivityObject吗?这很重要的原因是该对象具有与之关联的数据库连接.

Jon*_*nna 10

你可以把它想象using成try-finally的简称.因此,您的代码相当于:

IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse();
try
{
    try
    {
        Foo();
    }
    catch(ArgumentNullException e)
    {
        throw;
    }
}
finally
{
  if(databaseConnectivityObject != null)//this test is often optimised away
    databaseConnectivityObject.Dispose()
}
Run Code Online (Sandbox Code Playgroud)

看着这种方式,你可以看到Dispose()如果抛出异常确实会调用它,因为try-finally在try-catch之外.

这正是我们使用的原因using.


Hab*_*bib 7

我们假设Foo()失败并且触发异常并且有效地破坏程序将dataConnectivityObject处理掉?

是的,它会.使用内部使用try-finally,(仅使用适用于那些实现的那些IDisposable)

来自MSDN-使用声明

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose .您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果; 实际上,这就是编译器如何翻译using语句.