對C#中的Close()和Dispose()的淺顯理解

來源:互聯網
上載者:User

.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.Emptyconn.Open();//再開啟。拋異常

實驗結果:

1、兩者都關閉了串連

2、Close後串連可以再次開啟;而Dispose後串連字串被清空,串連不能再開啟

如此看來,Close和Dispose不完全是一回事,有點毀三觀。現在似乎可以理解為,Close不負責銷毀對象,僅僅是根據類的功能,實現業務上的一個“關閉”,在本例,僅僅是改變了一下串連狀態(從串連→關閉);而Dispose,則一如它的使命一樣,銷毀對象並釋放資源。換言之,Close只與業務有關,Dispose只與對象有關。所以被Close的對象可以再次“開啟”並使用,而Dispose則徹底歇菜。

綜上,關於它倆,得出淺顯結論:

1、Close負責關閉業務,Dispose負責銷毀對象。Dispose會負責Close的一切事務,額外還有銷毀對象的工作,即Dispose包含Close

2、當你有明確需求的時候,不要混用二者

3、兩者連在一起用沒什麼意義。要麼關閉~以便再次使用,要麼銷毀~不再使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.