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

本文关键字:对象 发生了 什么 创建 using 语句 | 更新日期: 2023-09-27 18:12:03

我一直在努力寻找这个,找不到答案,可能是我没有看正确的地方,所以请容忍我…

问题:

我知道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
}

哪个是最佳实践,哪个更有效?

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

命令对象的dispose方法也会被调用吗?

没有

或者我应该这样做:

是的

哪个是最佳实践,哪个更有效?

最后一个。注意你可以避免在页面上使用"heading right":

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

我懒得用ADO。直接净;另一个选择是获得一个工具来处理除连接之外的所有事情(示例显示为"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
}

那么你就不需要担心命令,数据阅读器,参数等

是的,你应该使用第二个。你也可以将语句缩写为:

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

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

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

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

你应该使用using语句来处理你想要处理的对象。因此,您应该使用自己提供的最后一个示例(包含两个using语句)。

相关文章: