1. 程式人生 > >C#.net中的using語法, SQl連線資料庫

C#.net中的using語法, SQl連線資料庫

using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(SQLString,connection))
{
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException e)
{
connection.Close();
throw e;
}
finally
{
cmd.Dispose();
connection.Close();

}
}

}

其中using (SqlCommand cmd = new SqlCommand(SQLString,connection))這句為什麼要這樣寫呢?直接寫SqlCommand cmd = new SqlCommand(SQLString,connection不就可以了嗎?
為什麼還要用using()包圍呀,這樣寫有什麼好處嗎?
最好能引用微軟官方解釋.
請不要簡單說一句:花括號中用完,就會自動釋放.
我想知道的是
什麼時候這樣寫?
為什麼這樣寫?
這樣寫的好處?
怎樣這樣寫?

答:   

1.如果你需要使用一個物件,這個物件需要佔用很多緊缺的資源,使用完成後需要馬上釋放掉的話,建議使用using語句


2.這樣寫是為了避免資源釋放不及時導致的衝突或效能問題
3.這樣寫的話處是減少因為爭搶資源發生衝突或效能問題的概率
4.以下為微軟官方關於using語句的解釋
提供能確保正確使用 IDisposable 物件的方便語法.
語法
複製程式碼 
using (Font font1 = new Font("Arial",10.0f)) {
..byte charset = font1.GdiCharSet;
}
備註
File 和 Font 是訪問非託管資源(本例中為檔案控制代碼和裝置上下文)的託管型別的示例.有許多其他類別的非託管資源和封裝這些資源的類庫型別.所有這些型別都必須實現 IDisposable 介面.
按照規則,當使用 IDisposable 物件時,應在 using 語句中宣告和例項化此物件.using 語句按照正確的方式呼叫物件上的 Dispose 方法,並(在您按照前面所示方式使用它時)會導致在呼叫 Dispose 時物件自身處於範圍之外.在 using 塊中,物件是隻讀的並且無法進行修改或重新分配.

using 語句確保呼叫 Dispose,即使在呼叫物件上的方法時發生異常也是如此.通過將物件放入 try 塊中,並在呼叫 finally 塊中的 Dispose,可以獲得相同的結果;實際上,這就是編譯器轉換 using 語句的方式.前面的程式碼示例在編譯時將擴充套件到以下程式碼(請注意,使用額外的大括號為物件建立有限範圍):
{
複製程式碼 
Font font1 = new Font("Arial",10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
可以將多個物件與 using 語句一起使用,但必須在 using 語句中宣告這些物件,如以下示例所示:
複製程式碼 
using (Font font3 = new Font("Arial",10.0f),
font4 = new Font("Arial",10.0f))
{
// Use font3 and font4.
}
可以例項化資源物件,然後將變數傳遞給 using 語句,但這不是最佳做法.在這種情況下,該物件將在控制權離開 using 塊之後保持在範圍內,即使它可能將不再具有對其非託管資源的訪問權也是如此.換句話說,再也不能完全初始化該物件.如果試圖在 using 塊外部使用該物件,則可能導致引發異常.由於這個原因,通常最好是在 using 語句中例項化該物件並將其範圍限制在 using 塊中.
複製程式碼 
Font font2 = new Font("Arial",10.0f);
using (font2) // not recommended
{
// use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight();