2010-06-25 65 views
17

我使用的是FtpWebResponse類,但沒有看到Dispose方法。 It turns out這個類實現IDisposable,但這樣明確,這樣你必須先投你的實例IDisposable接口調用Dispose之前:爲什麼類會顯式而不是隱式地實現IDisposable?

// response is an instance of FtpWebResposne 
((IDisposable) response).Dispose(); 

爲什麼會一類的,如這一個設計師選擇要明確實現IDisposable?由於Anthony Pegram says這樣做,掩蓋了這樣一個事實,即應該爲普通開發人員處理該對象,而該開發人員在每次使用某個類時都未查閱文檔。

回答

14
+0

我同意,但這裏怪異的部分是行爲可能不同。反射器顯示Dispose()調用Close(),然後調用名爲OnDispose()的內部虛擬。 Close()不會,所以你可能會從這兩種方法中獲得不同的行爲(儘管它對FtpWebResponse沒有影響,因爲OnDispose()實現是空的) – JMarsch 2010-06-25 15:46:42

+1

兩個具有相同名稱的方法有什麼問題? CLR通過C#(p。546)表示:「某些提供dispose模式的類也提供了一個方便的Close方法;但是dispose模式不需要這種方法。例如,System.IO.FileStream類提供了dispose模式,而這個類也是提供了一種Close方法,程序員發現關閉文件比處理文件更自然。「 – MCS 2010-06-25 15:49:08

+1

@JMarsch:這可能是一個延期; .NET 1.1 BCL類有很多情況,其中'Close'和'Dispose'確實有稍微不同的行爲。 AFAIK,除了'DbConnection'和派生類型之外,這些都已經被清除了。 – 2010-06-25 15:54:26

1

這是一個有點怪異的在我身上。對於它的價值:基類(WebResponse)實現一個Close()方法。反射器顯示WebResponse的Dispose()方法只調用Close()和一個不執行任何操作的Internal OnDispose虛擬。

我不得不承認它對我來說有點味道,但我敢打賭,他們明確實施了IDisposable,以便在調用Close()或Dispose()之間不會在Intellisense中造成混淆。

1

除了什麼的已經說了,我可能會建議,實施IDisposable明確鼓勵使用using塊的,因爲它可以在其上實現IDisposable任何類型的使用,它是更自然的(對大多數人來說,反正)寫這樣的:

using (var response = GetResponse()) 
{ 
    // do something 
} 

比這

var response = GetResponse(); 

// do something 

((IDisposable)response).Dispose(); 

我不知道這將是一個開發者的意圖明確實施IDisposable,但它是可能的。

+3

它確實可以使用,但只有*如果你知道物體是一次性的!問題是,人們*不*諮詢文件將不知道。並考慮可能具有較差文檔的代碼庫(或者根本沒有)。 – 2010-06-25 15:56:19

5
  • 偶爾一個類將有一個Dispose方法,它是接口的一部分,但實際上並不需要被調用,因爲要處理的唯一資源是內存:例如,MemoryStream。
  • 正如其他人所說,如果類有一個與Dispose做同樣事情的Close方法,可以說Dispose只需要存在來支持「using」模式,所以它也可以是明確的。
相關問題