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

时间:2012-09-03 10:21:22

标签: c# .net using-statement

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

using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse())
{
    try
    {
        Foo();
    }
    catch (ArgumentNullException e)
    {
        throw;
    }
}

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

5 个答案:

答案 0 :(得分: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()
}

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

这正是我们使用using

的原因

答案 1 :(得分:7)

  

我们假设Foo()失败并且有效地触发了异常   打破程序会将databaseConnectivityObject处理掉吗?

是的。使用内部使用try-finally(仅使用适用于实现IDisposable的那些

来自MSDN- using statement

  

using语句确保Dispose被称为,即使是   在对象上调用方法时发生异常。您可以   通过将对象放在try块中来实现相同的结果   然后在finally块中调用Dispose;其实这是怎么回事   using语句由编译器翻译。

答案 2 :(得分:3)

是的,您的using块将丢弃databaseConnectivityObject,无论您是否有try-catch块。

您正确地说使用块很重要,您应该将它用于实现IDisposable的所有类,以确保即使在发生异常时也能正确处理它们。

来自MSDN- using statement

  

using语句确保Dispose被称为,即使是    在对象上调用方法时发生异常。您可以    通过将对象放在try块中来实现相同的结果    然后在finally块中调用Dispose;其实这是怎么回事    using语句由编译器翻译。

答案 3 :(得分:3)

实现using块时,如果括号中的对象实现了IDisposable接口,则会被处置。

即使foo()失败,它仍会处理。

using语句中的对象必须实现IDisposable接口。

此外,这些问题"Uses of using in c sharp""using statement vs try finally"进一步说明了using声明的用法和实用性。

C# Language Specification的第8.13节详细说明了使用声明。

答案 4 :(得分:2)

您的using代码相当于

IDatabaseConnectivityObject databaseConnectivityObject = new IDatabaseConnectivityObject ();
try
{
//To do code here
}
finally
{
    if(databaseConnectivityObject!=null)
    {
       databaseConnectivityObject.Dispose();
    }
}

使用声明主要分为三部分,即

  1. 采集
  2. 用法
  3. 处置
  4. 首先,获取资源并使用finally语句在try块上进行使用。最后,将对象放在finally块中,如上面的等效代码所示....