.net中的許多類都提供了Close()和Dispose()方法,一直以來我都以為它倆是一回事,是完全等價的,在任何地方,用其一即可。
有些類說Close比說Dispose更符合用戶的理解(如關閉連接、關閉流),所以這讓我覺得Close就是作為Dispose的另一種使用方式而存在,本來只需一個Dispose就夠了,事實上呢我寫的程序也沒有因為隨意使用它倆而造成過任何問題,所以一直以來沒深究。
今天做了個測試:
2 conn.Open();
3
4 conn.Close(); // 先關閉
5 Console.WriteLine(conn.State); // 連接狀態:關閉
6
7 Console.WriteLine(conn.ConnectionString); // 此時連接字符串還在
8 conn.Open(); // 再打開。正常
9
10 conn.Dispose(); // 先釋放
11 Console.WriteLine(conn.State); // 連接狀態:關閉
12
13 Console.WriteLine(conn.ConnectionString); // 連接字符串已經置為空:string.Empty
14 conn.Open();//再打開。拋異常
測試結果:
1、兩者都關閉了數據庫連接
2、Close后數據庫連接可以再次打開;而Dispose后連接字符串被清空,連接不能再打開。
如此看來,Close和Dispose不完全是一回事。現在似乎可以理解為,Close不負責銷毀對象,僅僅是根據類的功能,實現業務上的一個“關閉”,在本例,僅僅是改變了一下連接狀態(從連接→關閉);而Dispose,則是銷毀對象並釋放資源。換言之,Close只與業務有關,Dispose只與對象有關。所以被Close的對象可以再次使用,而Dispose則徹底銷毀。
注:原則上能 Dispose 的類就要 Dispose ,類似FileStream 的對象如果不在后面的代碼中使用,不用 close 直接Dispose 即可,Dispose其實隱含了close 的。
數據連接對象推薦使用 using 代碼塊自動釋放以防止中途出現異常,.net 不要把對象 = null; 在一般情況下.net的一個變量如 FileStream fs = new FileStream(@"C:\test.txt", FileMode.OpenOrCreate);這個只是一個地址而已,= null 是沒啥用的。如果等於null 反倒影響GC回收了。
綜上,得出淺顯結論:
1、Close負責關閉業務,Dispose負責銷毀對象。Dispose會負責Close的一切事務,額外還有銷毀對象的工作,即Dispose包含Close
2、當有明確需求的時候,不要混用二者
3、兩者連在一起用沒什么意義。要么關閉以便再次使用,要么銷毀不再使用。
如各位有更好見解,歡迎指正。