"使用"的好处用于SqlCommand初始化的块

时间:2014-12-28 15:31:25

标签: c# asp.net .net sql-server .net-4.5

我理解在从应用程序连接到sql server时使用using块的概念,因为它会在超出范围时关闭连接并节省我们编写时间{{1}块。

但我的问题是,在初始化try catch finally时使用using是否有任何好处,通常我会这样做:

SqlCommand

但是通过在使用string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString; using(SqlConnection con = new SqlConnection(cs)) { SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con); con.Open(); DropDownList1.DataSource = cmd.ExecuteReader(); DropDownList1.DataTextField = "City"; DropDownList1.DataValueField = "ID"; DropDownList1.DataBind(); } 中使用SqlCommand初始化可以获得哪些好处?

block

我在网上搜索过的所有资料都说明连接一旦超出范围就会被关闭,是的,我理解但是将SqlCommand放入使用块会使它变得更高效吗?

非常感谢任何建议或指示,谢谢。

1 个答案:

答案 0 :(得分:4)

查看源代码时,您可以清楚地看到这一点。

这是SqlCommand.Dispose

的实施
override protected void Dispose(bool disposing) 
{
    if (disposing) 
    {
        _cachedMetaData = null;
    }

    base.Dispose(disposing);
}

正如您所看到的,这并没有多大帮助。但是,在查看base.Dispose

public void Dispose() 
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

SqlCommand继承自DbCommandComponent继承自ComponentSqlCommand实现了finalizer,这意味着一旦没有人引用该对象,该对象就不会被处理掉,因为它仍然引用了finalizer queue

当您使用using语句包装SqlCommand时,其中最重要的部分是其基类(Component)调用GC.SupressFinialize,这将删除对终结器队列的引用,一旦GC启动,就可以收集对象。

这就是IDisposable实现{{1}}的原因,应该予以处理。