簡體   English   中英

“使用”塊對SqlCommand初始化的好處

[英]Benefits of “using” block for SqlCommand initialization

我理解在從應用程序連接到sql server時using塊的概念,因為它會在超出范圍時關閉連接並節省我們編寫try catch finally塊的時間。

但我的問題是,通常在初始化SqlCommand時使用using有什么好處我會做類似的事情:

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();
}

但是通過在使用block放置SqlCommand初始化,我可以獲得哪些好處?

string cs = ConfigurationManager.ConnectionStrings["CS1"].ConnectionString;

using(SqlConnection con = new SqlConnection(cs))
{
    using(SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.City", con))
    { 
        con.Open();
        DropDownList1.DataSource =  cmd.ExecuteReader();
        DropDownList1.DataTextField = "City";
        DropDownList1.DataValueField = "ID";
        DropDownList1.DataBind();
    }
}

我在網上搜索過的所有材料都談到了連接一旦超出范圍就被關閉了,是的,我理解但是將SqlCommand放入使用塊會使它更高效嗎?

任何建議或指示非常感謝謝謝。

查看源代碼時,您可以清楚地看到這一點。

這是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繼承自DbCommand ,而DbCommand繼承自Component Component實現了一個終結器 ,這意味着一旦沒有人引用它就不會處理該對象,因為它仍然具有對終結器隊列的引用。

當您using語句包裝SqlCommand時,最重要的部分是它的基類(Component)調用GC.SupressFinialize ,它會刪除對終結器隊列的引用,並在GC啟動后讓對象被收集。

這就是為什么SqlCommand實現IDisposable ,應該被處理掉的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM