如果我使用“using”构造,我知道对象会自动处理掉。如果“using”构造中的语句引发异常,会发生什么。 “使用”对象仍然处理?如果是的话,何时?
答案 0 :(得分:11)
编译器将using
块转换为:
DisposableType yourObj = new DisposableType();
try
{
//contents of using block
}
finally
{
((IDisposable)yourObj).Dispose();
}
将Dispose()
调用放入finally
块,确保Dispose
始终调用 - 除非在实例化网站上发生异常,因为那发生在try
之外。
重要的是要记住using
不是一种特殊的运算符或构造 - 它只是编译器替换的东西,它稍微有些迟钝。
答案 1 :(得分:2)
This article explains it nicely.
在内部,这个坏男孩会在分配的对象周围生成一个try / finally,并为您调用Dispose()。它可以省去手动创建try / finally块和调用Dispose()的麻烦。
答案 2 :(得分:2)
实际上使用block等同于try - finally block,这确保最终将始终执行,例如
using (SqlConnection con = new SqlConnection(ConnectionString))
{
using (SqlCommand cmd = new SqlCommand("Command", con))
{
con.Open();
cmd.ExecuteNonQuery();
}
}
等于
SqlConnection con = null;
SqlCommand cmd = null;
try
{
con = new SqlConnection(ConnectionString);
cmd = new SqlCommand("Command", con);
con.Open();
cmd.ExecuteNonQuery();
}
finally
{
if (null != cmd);
cmd.Dispose();
if (null != con)
con.Dispose();
}