對C#中的Close()和Dispose()的淺析


.net中的許多類都提供了Close()和Dispose()方法,一直以來我都以為它倆是一回事,是完全等價的,在任何地方,用其一即可。

有些類說Close比說Dispose更符合用戶的理解(如關閉連接、關閉流),所以這讓我覺得Close就是作為Dispose的另一種使用方式而存在,本來只需一個Dispose就夠了,事實上呢我寫的程序也沒有因為隨意使用它倆而造成過任何問題,所以一直以來沒深究。

今天做了個測試:

 1 SqlConnection conn =  new SqlConnection( " 連接字符串 "); 
 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、兩者連在一起用沒什么意義。要么關閉以便再次使用,要么銷毀不再使用。 

如各位有更好見解,歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM