繁体   English   中英

在using语句内创建的对象会怎样?

[英]What happens to the objects created inside a 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
}

哪一种是最佳做法,哪一种会更有效?

命令对象的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
}

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

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

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语句)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM