2009-09-06 97 views
0

我想讓Windows窗體控件只讀和IDisposable。使Windows窗體控件只讀和IDisposable

這是一件好事還是壞事,當調用Dispose時我需要注意什麼?

我有一個Tab(PageTab),我擴展並插入一個具有listview和另一個工具欄控件的面板。這些選項卡然後插入到選項卡控件(所有本機.NET Windows窗體控件)中。

當用戶關閉其中一個選項卡時,我會調用Dispose方法(它遵循MSDN實現IDisposable的方法)。

明智或建議將控件聲明爲只讀(見下文)?

protected readonly ListView _AccountsList = new ListView(); 
protected readonly Panel _Panel = new Panel(); 

因爲在Dispose方法我只是叫_Panel.Dipose()等他們,但我不能將它們設置爲null。我想盡可能避免泄漏,並收集垃圾。

非Designer GUI開發和處理它們的最佳方式是什麼?

回答

4

Control.Dispose的默認實現(由TabPage繼承)是非常充分的。它迭代存儲在Controls集合成員中的子控件,並調用它們的Dispose()方法。你不需要幫忙。

只有兩種情況下,你應該調用Dispose()顯式:

  • 當您刪除從控件集合控制。在這裏調用Dispose()是一個很難的要求。不這樣做會使窗口句柄在程序的整個生命週期中保持活動狀態,但它不可見。如果你不處理它,你會有泄漏。
  • 當您使用ShowDialog()顯示窗體時。這繞過了窗體及其子控件的正常自動處理,這樣就可以讀取對話結果而不會冒着ObjectDisposed異常的風險。使用聲明是正確的方法。

後一種情況實際上並不是泄漏,Control類的終結器確保最終釋放對話框的窗口句柄,假設對話對象沒有留下活動引用。

控件是其中幾個類忘記調用Dispose()實際上可能導致不可控制的資源泄漏。您是正確的,因爲您必須在TabPage派生對象上顯式調用Dispose()以在刪除頁面時對其進行處理。但是你不必擔心它的子控件。

+0

感謝您的信息!從來沒有處理控制.. – GorillaApe 2011-08-13 00:23:09

1

如果該選項卡被關閉,那麼可能不會有任何其他引用,因此您不必擔心將值設置爲空。

爲了GC而將變量設置爲空的唯一值是,否則仍然是對象的實時引用。這聽起來不像這種情況。