如果我有一个围绕try catch语句的using块,那么如果catch会触发异常,那么using语句中的对象会发生什么?请考虑以下代码:
using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse())
{
try
{
Foo();
}
catch (ArgumentNullException e)
{
throw;
}
}
如果我们假设Foo()失败并且触发了异常并且有效地破坏了程序将处理databaseConnectivityObject?这很重要的原因是该对象具有与之关联的数据库连接。
答案 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
的那些
using语句确保Dispose被称为,即使是 在对象上调用方法时发生异常。您可以 通过将对象放在try块中来实现相同的结果 然后在finally块中调用Dispose;其实这是怎么回事 using语句由编译器翻译。
答案 2 :(得分:3)
是的,您的using
块将丢弃databaseConnectivityObject,无论您是否有try-catch块。
您正确地说使用块很重要,您应该将它用于实现IDisposable
的所有类,以确保即使在发生异常时也能正确处理它们。
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();
}
}
使用声明主要分为三部分,即
首先,获取资源并使用finally语句在try块上进行使用。最后,将对象放在finally块中,如上面的等效代码所示....