3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
當(dāng)我們開(kāi)發(fā)C#代碼的時(shí)候,經(jīng)常碰到一個(gè)問(wèn)題,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么區(qū)別?
首先,Dispose和Close基本上應(yīng)該是一樣的。Close是為了那些不熟悉Dispose的開(kāi)發(fā)者設(shè)計(jì)的。因?yàn)榛旧纤械膁eveloper都知道Close是干嗎的(特別是對(duì)于那些有C++背景的developer)。
但是當(dāng)我們寫(xiě)code時(shí)候,如果要實(shí)現(xiàn)Close和Dispose的時(shí)候,要注意Close和Dispose的設(shè)計(jì)模式。.net的一些class只提供Close,而且派生自IDisposable,并且隱藏了Dispose方法。是不是覺(jué)得很不明白了?
對(duì)這些class來(lái)說(shuō),關(guān)鍵在于它們顯式的(explicitly)實(shí)現(xiàn)了IDisposable。對(duì)于隱式實(shí)現(xiàn)來(lái)說(shuō),你只需要調(diào)用"new A().Dispose()",但是對(duì)于顯式實(shí)現(xiàn)來(lái)說(shuō),Dispose不會(huì)是這個(gè)class的成員函數(shù)。唯一的調(diào)用方式是你先要cast到 IDisposable才行。(“new A().Dispose()”編譯不過(guò),但是“((IDisposable)new A()).Dispose()”可以編譯過(guò))。所以這樣就符合了設(shè)計(jì)的要求:提供Close(),隱藏Dispose(),并且實(shí)現(xiàn)了 IDisposable接口。
在.net的framework里,Close()被設(shè)計(jì)成public的,并且在Close()里面call被隱藏的Dispose(); Dispose()去call另一個(gè)virtual的Dispose(bool)函數(shù)。所以如果你從這個(gè)class繼承,你就必須實(shí)現(xiàn)Dispose (bool)方法。
調(diào)用者call Close()的時(shí)候就會(huì)call到你重載的那個(gè)Dispose(bool)方法去釋放資源。

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
close是關(guān)閉而已,不釋放資源。就像開(kāi)門(mén)和關(guān)門(mén)一樣,對(duì)于你進(jìn)去做的事情他不管.
而dispose就是釋放資源!就是把StreamReader對(duì)象里面的數(shù)據(jù)給清空,不豪存儲(chǔ)空間.

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
Close();//關(guān)閉
Dispose();//消毀,這個(gè)不用管,自己用調(diào)用。
添加回答
舉報(bào)