【问题标题】:What happens to the objects created inside a using statement?在 using 语句中创建的对象会发生什么?
【发布时间】:2014-07-09 11:49:16
【问题描述】:

我一直在尝试搜索,但找不到答案,可能是我没有找到正确的地方,所以请多多包涵...

问题:

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

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

【问题讨论】:

    标签: c# using-statement


    【解决方案1】:

    会不会也调用命令对象的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
    }
    

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

    【讨论】:

    • 感谢您的快速响应...您说另一种选择是获取工具?您能告诉我除了 dapper 之外哪种工具最好,或者您使用哪种工具??
    • @SyedFarjadZiaZaidi “最佳”是主观的,需要“在什么方面?”。由于我是“dapper”的主要作者,因此可以肯定我主要使用:“dapper”。
    • 其实我之前没用过 dapper 也不知道怎么用...我想我会去读一些关于它的东西并开始使用它:)
    • 还有一个问题,在作用域内创建的对象在作用域外是不可访问的,而 GC 本身将它们标记为一次性,然后再将它们释放掉,这样内存最终会被释放吗?对吗?
    • @SyedFarjadZiaZaidi GC 与一次性用品无关;完全分离的概念和关注点。 GC 从不处理任何东西。它有时会完成事情,但那是非常不同的。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复 :)
    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您的回复:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多