如果我使用 "using" 结构,我知道对象会自动被处理。但是如果 "using" 结构中的语句引发异常,那么会发生什么? "using" 对象是否仍然被处理?如果是,那么是在什么时候处理的?
using
块在编译器中被转换为以下代码:
DisposableType yourObj = new DisposableType();
try
{
//contents of using block
}
finally
{
((IDisposable)yourObj).Dispose();
}
将Dispose()
调用放在finally
块中可以确保Dispose
始终被调用 - 当然,除非异常发生在实例化站点之外(因为那是在try
之外发生的)。
重要的是要记住,using
不是一种特殊的运算符或结构 - 它只是编译器用稍微更晦涩的其他东西替换的东西。
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();
}
在内部,这个好东西会为分配的对象生成一个try / finally块,并为您调用Dispose()。 它省去了手动创建try / finally块和调用Dispose()的麻烦。
finally
块中也有一个null
测试。 - Ani