我使用的是TableLayoutPanel
,它是動態填充其他TablelayoutPanels
。Controls.Clear()清理有多深?
現在我想知道在動態填充的TableLayoutPanel
上撥打TableLayoutPanel.Controls.Clear
會發生什麼。顯然,所有的子佈局都被刪除了,但他們的孩子呢?它們是否妥善處置,還是需要擔心內存泄漏?
在調用Clear()
之前,我應該遞歸地移除子女的子女嗎?
我使用的是TableLayoutPanel
,它是動態填充其他TablelayoutPanels
。Controls.Clear()清理有多深?
現在我想知道在動態填充的TableLayoutPanel
上撥打TableLayoutPanel.Controls.Clear
會發生什麼。顯然,所有的子佈局都被刪除了,但他們的孩子呢?它們是否妥善處置,還是需要擔心內存泄漏?
在調用Clear()
之前,我應該遞歸地移除子女的子女嗎?
Clear不處理控件,導致內存泄漏。從鏈接:
調用Clear方法不會從內存中刪除控制句柄。 您必須顯式調用Dispose方法以避免內存泄漏。
由於環內設置食堂的索引,您可以控制集合複製到另一個列表並對其進行ForEach
循環或者使用向下For
循環。
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i)
myTableLayoutPanelControls[i].Dispose();
調用Dispose
將從內存中移除控件(當GC拿起它時)。這也將處理調用子控件的方法Dispose
。
一個問題是如果你有一個自定義控件實現了IDisposable
或者你正在重寫Dispose
方法而不調用base
方法。在您的對象的Dispose
方法中,您需要確保您已取消訂閱範圍外的任何事件。如果你不這樣做,那個引用會使你的對象保持活着。
你的問題有點混亂。 Clear()
將刪除引用,並且垃圾收集器將收集對象。
但是,您也使用單詞dispose
。被清除的對象將被調用而不是,因爲它們的Dispose
方法將被調用。因此,如果您不再使用這些對象,並且想要對它們調用Dispose
,則必須自己完成。
好吧,那麼問題是我應該在每個不再使用的對象上調用dispose,或者如果我只是讓gc刪除它,那麼可以。我想不到Dispose方法對於剛剛開始的程序至關重要的事情。同樣,我以前的評論中的問題仍然存在,因爲父母和孩子互相引用,GC是否會收集它們? – Xaser 2013-03-23 12:30:30
對我在發表上述評論 - 研究之前做了我應該做的事情。如果我獲得了正確的MSDN,Dispose方法可以被顯式調用並釋放非託管資源,GC隱式使用finalize方法(如果有效)。然而,正如keyboardP所說,Clear不會清除所有引用,所以我必須明確地調用Dispose。 – Xaser 2013-03-23 12:53:11
@Xaser'Clear'將清除控件內部的所有引用。它不會影響您在代碼中的引用。'Finalize'不保證被調用,這就是爲什麼如果你想確保清理所有非託管資源,你必須調用'Dispose'。 – clearpath 2013-03-25 10:10:22
如果沒有其他對象持有對它們的引用,則執行GC'ed。 – Magnus 2013-03-23 11:44:08
對,但我想知道,Sub-Tablelayoutpanel在它的子節點和子節點上有一個對其父節點的引用。我怎樣才能確定GC正確地將它們全部刪除 – Xaser 2013-03-23 11:49:28