[英]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.