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

C# 在using语句中创建的对象会发生什么情况?,c#,using-statement,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
语句调用对象的dispose方法,例如:

using (SqlConnection conn = new SqlConnection(conString))
{
    // some work
} 
// dispose method for this connection object will be called must.
但是使用语句在
中创建的对象会发生什么情况

using (SqlConnection conn = new SqlConnection(conString))
{
    SqlCommand cmd = new SqlCommand(query, conn);
    // some work
}      
还会调用command对象的dispose方法吗?或者我应该这样做:

using (SqlConnection conn = new SqlConnection(conString))
{
    using (SqlCommand cmd = new SqlCommand(query, conn))
    {
        //some work
    }
    // some work
}
哪一种是最佳实践,哪一种更有效

还会调用command对象的dispose方法吗

没有

或者我应该这样做:

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

哪一种是最佳实践,哪一种更有效

有效的那一个——最后一个。注意:您可以避免在页面上出现“右标题”:

using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
    // some work
}
我懒得直接使用ADO.NET;另一个选择是获得一个工具来处理除连接之外的所有事情(所示示例为“dapper”,但存在其他工具):

使用(SqlConnection conn=newsqlconnection(consting))
{
var data=conn.Query(someSql,new{foo,bar}).ToList();
//其中@foo和@bar是sql中的参数
}

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

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

using (SqlConnection conn = new SqlConnection(conString))
using (SqlCommand cmd = new SqlCommand(query, conn))
{
    //some work
}
// some work
如果不使用
语句用
包装一次性对象,则不会调用Dispose方法。在您的情况下,只会处理
连接

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

using (SqlConnection conn = new SqlConnection(conString))
{
    // some work
} 
// dispose method for this connection object will be called must.
如果该对象实现了
IDisposable
接口。否则,您甚至不能在
using
语句中使用对象


对于要在某些操作后处理的每个对象,应该使用
using
语句。因此,您应该使用您自己提供的最后一个示例(以及两个using语句)。

感谢您的快速响应。。。你说另一个选择是得到一个工具?您能告诉我除了dapper之外,哪种工具是最好的,或者您使用哪种工具?@SyedFarjadZiaZaidi“best”是主观的,需要一个“at what?”。由于我是“dapper”的主要作者,我敢打赌我主要使用“dapper”。实际上我以前没有使用过dapper,我不知道如何。。。我想我会去读一些关于它的东西,然后开始使用它:)还有一个问题,在作用域内创建的对象在作用域外是不可访问的,GC本身会将它们标记为可丢弃的,然后稍后再将它们处理掉,以便最终释放内存?对吧?@SyedFarjadZiaZaidi GC与一次性用品无关;完全分离的概念和关注点。GC从不处理任何东西。它有时会完成一些事情,但这是非常不同的。谢谢您的回复:)谢谢您的回复:)