在using语句中创建的对象会发生什么?

时间:2014-07-09 11:49:16

标签: c# using-statement

我一直试图搜索这个并找不到答案,可能是我没有找到合适的地方所以请耐心等待...

问题:

我知道using语句调用对象的dispose方法,例如:

using (SqlConnection conn = new SqlConnection(conString))
{
    // some work
} 
// dispose method for this connection object will be called must.

但是在using语句中创建的对象会发生什么?

using (SqlConnection conn = new SqlConnection(conString))
{
    SqlCommand cmd = new SqlCommand(query, conn);
    // some work
}      

是否还会调用命令对象的dispose方法?或者我应该这样做:

using (SqlConnection conn = new SqlConnection(conString))
{
    using (SqlCommand cmd = new SqlCommand(query, conn))
    {
        //some work
    }
    // some work
}

哪种方法最佳,哪种方式更有效?

3 个答案:

答案 0 :(得分:4)

  

是否也会调用命令对象的dispose方法?

没有

  

或者我应该这样做:

  

哪种方法最佳,哪种方式更有效?

有效的 - 最后一个。请注意,您可以避免"向右前进"在页面上:

using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
    // some work
}

我懒得直接使用ADO.NET;另一个选择是获得一个工具来处理除连接之外的所有事情(示例显示为" dapper",但存在其他工具):

using (SqlConnection conn = new SqlConnection(conString))
{
    var data = conn.Query<SomeType>(someSql, new { foo, bar }).ToList();
                    // where @foo and @bar are parameters in the sql
}

那么您不必担心命令,数据读取器,参数等。

答案 1 :(得分:2)

是的,你应该使用第二个。您也可以将该陈述缩短为:

using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
    //some work
}
// some work

如果您没有用using语句包装您的一次性对象,则不会调用Dispose方法。在您的情况下,只会处理connection

答案 2 :(得分:1)

  

我知道using语句调用对象的dispose方法,例如:

如果该对象实现了IDisposable接口。否则,您甚至无法在using语句中使用对象。

在执行某些操作后,您应该为要处理的每个对象使用using语句。所以你应该使用自己提供的最后一个例子(使用两个using语句)。