2011-10-03 64 views
3

.NET Framework(和OpenFileDialog)中的FolderBrowserDialog組件實現IDisposible接口,這意味着我們應該在我們完成處理或發生不好的事情(非託管資源泄漏)後的某個適當時間調用其方法Dispose我是否必須在FolderBrowserDialog上調用Dispose方法?

在Visual Studio WinForm設計,如果我將一個FolderBrowserDialog組件到窗體上,由設計器生成的代碼似乎沒有照顧這在所有,任何代碼調用FolderBrowserDialog Dispose方法。

相反,如果我拖動Timer(中System.Windows.Forms命名空間一個),這也實現了IDisposible接口,所生成的代碼將是:

this.components = new System.ComponentModel.Container(); 
this.timer1 = new System.Windows.Forms.Timer(this.components); 

由計時器與所述容器(this.components關聯),當容器被丟棄時,定時器被保證妥善處理 - 當調用Form.Close()Form.Dispose()時發生。

那麼爲什麼FolderBrowserDialog組件接受這種特殊待遇?

+2

所有的shell對話框類包裝只有一個Dispose()方法,因爲它們從它們的Component基類繼承了一個。它們實際上並不需要處理,當本機對話框關閉時,它們的非託管資源將在內部處理。 @thecoop正確地解釋了他們如何避免Dispose()被調用。 –

+0

嗨Hans(nobugz),很高興見到你。看着Reflector,我在FolderBrowserDialog的RunDialog方法中找到對NativeWindow.DestroyHandle()的調用,所以我認爲你是對的。 – kennyzx

回答

3

好點!原因可能是FolderBrowserDialog未提供採用​​參數的構造函數,而Timer則提供此參數。至於爲什麼這樣,你只能問原始的winforms設計師。也許它不是真的被設計用於這種設計?他們只意味着它被用在using聲明中的代碼中?

記住,FolderBrowserDialog,其父母,並沒有真正從Component覆蓋Dispose,所以它實際上並不需要處置任何東西。

相關問題