"使用" C#中的语句 - 这是嵌套的try / finally吗?

时间:2015-09-05 04:23:04

标签: c#

我发现了以下代码段:

using (IDbCommand selectCommand = this.createCommand(selectSQL))
using (IDataReader theData = selectCommand.ExecuteReader())
{
  while (theData.Read())
  {
    Phone aPhone = new Phone(...some code here...);
    thePhones.Add(aPhone);
  }
}

现在我试图通过将上面的代码解释为旧using语句来学习此上下文中的try/finally语句。根据我的理解,using语句会将括号后的代码解释为try。在这种情况下,try应该包含(IDbCommand selectCommand = this.createCommand(selectSQL))之后的所有内容。但是,在此代码中,第一个using之后会立即出现另一个using语句。

在此上下文中将它们解释为嵌套 try/finally语句是否正确?

3 个答案:

答案 0 :(得分:3)

使用语句将自动为其声明中的任何IDisposable对象调用Dispose()。重要的是要注意,这不是您自己的代码可能需要执行的任何try / catch / finally语句的替代。 using语句确保在它的块中的任何代码抛出或不抛出时将调用Dispose()。这在使用I / O对象时非常重要,例如网络调用,流读取,数据库调用等。这将确保您没有内存泄漏或锁定文件。

using (IDbCommand selectCommand = this.createCommand(selectSQL))
{
    //an exception or not will call Dispose() on selectCommand

    using (IDataReader theData = selectCommand.ExecuteReader())
    {
        //an exception or not will call Dispose() on theData

        while (theData.Read())
        {
            Phone aPhone = new Phone(...some code here...);
            thePhones.Add(aPhone);
        }
    }
}

在不使用语句的情况下运行此代码的“等效”将是:

var selectCommand = this.createCommand(selectSQL);
try
{
    var theData = selectCommand.ExecuteReader();
    try
    {
        while (theData.Read())
        {
            Phone aPhone = new Phone(...some code here...);
            thePhones.Add(aPhone);
        }
    }
    finally
    {
        if (theData != null)
        {
            theData.Dispose();
        }
    }
}
finally
{
    if (selectCommand != null)
    {
        selectCommand.Dispose();
    }
}

但是,不应使用上面的代码,因为using语句经过精炼,优化,保证等,但它的要点就在上面。

答案 1 :(得分:0)

using (IDbCommand selectCommand = this.createCommand(selectSQL))
using (IDataReader theData = selectCommand.ExecuteReader())
{
}

在编译时将转换为

using (IDbCommand selectCommand = this.createCommand(selectSQL))
{
    using (IDataReader theData = selectCommand.ExecuteReader())
    {
    }
}

就是这样。它与尝试捕获任何东西无关

答案 2 :(得分:0)

是的,您的代码被解释为

using (IDbCommand selectCommand = this.createCommand(selectSQL))
{
    using (IDataReader theData = selectCommand.ExecuteReader())
    {
      while (theData.Read())
      {
        Phone aPhone = new Phone(...some code here...);
        thePhones.Add(aPhone);
      }
    }
}

可以被认为是“嵌套的try / finally块”

使用多个using语句就像使用多个if语句一样,你可以做到

if(foo)
if(bar)
{
    DoStuff()
}

相同
if(foo)
{
    if(bar)
    {
        DoStuff()
    }
}