关于“使用”构造的基本知识

时间:2010-10-03 05:45:45

标签: c# .net vb.net

如果我使用“using”构造,我知道对象会自动处理掉。如果“using”构造中的语句引发异常,会发生什么。 “使用”对象仍然处理?如果是的话,何时?

3 个答案:

答案 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();
}