Close() and Dispose() are basically the same thing on an ADO.NET connection
object for providers shipped by Microsoft, and typically for 3rd party
providers as well (haven't seen one that does it differently, but you never
know :). The only difference is that Dispose also clears the connection
string. Calling only 1 of them is enough - whichever you prefer or applies
more to your scenario (e.g. C# "using" statement calls Dispose).
--
Pablo Castro
Program Manager - ADO.NET Team
Microsoft Corp.
引用微軟ADO.Team的經理的話說,sqlconnection的close和dispose實際是做的同一件事,唯一的區別 是Dispose方法清空了connectionString,即設置為了null.
SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=northwind;User ID=sa;Password=steveg");
con.Open();
con.Close();
con.Open();
con.Dispose();
con.Open();
上例運行發現,close掉的connection可以重新open,dispose的不行,因為connectionstring清空了 ,會拋出InvalidOperationException提示The ConnectionString property has not been initialized ,但請注意此時sqlconnection對象還在。
如果dispose後給connectionString重新賦值,則不會報錯。
由此得出的結論是不管是dispose還是close都不會銷毀對象,即不會釋放內存,它們會把 sqlconnection對象丟到連接池中,那此對象什麼時候銷毀呢?我覺得應該是connection timeout設置的 時間內,如果程序中沒有向連接池發出請求說要connection對象,sqlconnection對象便會銷毀,這也是 連接池存在的意義。
剛開始以為dispose會釋放資源清空內存,如果這樣的話,連接池不是每次都是要創建新對象,那何來 重用connection呢?在網上看到很多人說close比dispose好,我想真正的原因是dispose後的 sqlconnection對象要重新初始化連接字符串而已,並不是象某些人說的dispose會釋放對象。
所以在try..catch和using的選擇上大膽的使用using吧,真正的效率差異我想可能只有百萬分之一秒 吧(連接池重用該連接對象初始化連接字符串的時間),而且enterprise library中封裝的data access 層全是用的using,從代碼的美觀和效率上綜合考慮,using好
補充:using不會捕捉其代碼快中的異常,只會最後執行dispose方法,相當於finally{dispose}, 本文主要是想說明dispose和close的差異,因為using是絕對dispose的,可是如果人為的寫try..finally 有的人會選擇close有的人會選擇dispose,實際上在這2者的選擇上是有差異的,dispose方法會執行 close方法
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
如有錯誤,希望高手不吝指正