.net中的許多類都提供了Close()和Dispose()方法,一直以來我都以為它倆是一回事,是完全等價的,在任何地方,用其一即可,這一意識源於《NET設計規范:約定、慣用法與模式》一書中,P239和P240關於這倆方法的設計建議。按書中的字面理解,Close就應該設計為與Dispose一樣的功能,是為了照顧自然語言的一種考量,的確對於有些類,說Close比說Dispose更符合用戶的理解(如關閉連接、關閉流),所以這讓我覺得Close就是作為Dispose的另一種使用渠道而存在,本來只需一個Dispose就夠了,事實上我也沒有因為隨意使用它倆而造成過任何問題,所以一直以來沒深究。
可是今天在回答一個百度知道問題的時候,涉及到這倆方法的討論,我有意識的做了個試驗:
SqlConnection conn = new SqlConnection("連接字串"); conn.Open(); conn.Close();//先關閉 Console.WriteLine(conn.State);//連接狀態:關閉
Console.WriteLine(conn.ConnectionString);//此時連接字串還在 conn.Open();//再打開。正常 conn.Dispose();//先釋放
Console.WriteLine(conn.State);//連接狀態:關閉
Console.WriteLine(conn.ConnectionString);//連接字串以置空,為string.Empty conn.Open();//再打開。拋異常
試驗結果:
1、兩者都關閉了連接
2、Close后連接可以再次打開;而Dispose后連接字串被清空,連接不能再打開
如此看來,Close和Dispose不完全是一回事,有點毀三觀。現在似乎可以理解為,Close不負責銷毀對象,僅僅是根據類的功能,實現業務上的一個“關閉”,在本例,僅僅是改變了一下連接狀態(從連接→關閉);而Dispose,則一如它的使命一樣,銷毀對象並釋放資源。換言之,Close只與業務有關,Dispose只與對象有關。所以被Close的對象可以再次“打開”並使用,而Dispose則徹底歇菜。
綜上,關於它倆,得出淺顯結論:
1、Close負責關閉業務,Dispose負責銷毀對象。Dispose會負責Close的一切事務,額外還有銷毀對象的工作,即Dispose包含Close
2、當你有明確需求的時候,不要混用二者
3、兩者連在一起用沒什么意義。要么關閉~以便再次使用,要么銷毀~不再使用