2010-09-08 75 views

回答

12

當您在窗體上呼叫Dispose時,它將爲其Controls集合中的每個控件調用Dispose。這些控件反過來也會這樣做,所以最終應該調用所有控件的方法Dispose。請注意,這不是基於控件是否存在於設計者中;它基於在完成對Dispose的調用時在表格的集合中找到的控件實例。

當我看到這種情況不會發生的唯一情況是,如果您自己創建一個容器控件並覆蓋Dispose而不將該調用傳播到基類或遍歷包含的控件並在其上調用Dispose

+0

是的。組件的執行方式不同,這就是自動生成的Dispose()方法所要處理的內容。從Controls集合中刪除控件並且不處理它是一種很好的泄漏方法。 – 2010-09-08 19:48:30

4

它應該。您可能需要查看YourForm.designer.cs文件。它看起來是這樣的:

protected override void Dispose(bool disposing) 
{ 
    if(disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing) 
} 

base.Dispose();通話將負責清理添加到表單控件。

+0

這不完全正確;除非表單上有非UI組件(例如'Timer','HelpProvider'或'BackgroundWorker'),否則'components'字段爲'null'。 '組件'處理這些組件。它不*調用處理其他控件,如按鈕,文本框等。 – 2010-09-08 19:13:24

+0

確切地說,表單的控件實際上是通過調用'base.Dispose()',即在'Control.Dispose()'內部處理的。實際上有更多的清理,正如您在使用Reflector查看「Form.Dispose()」時所看到的那樣。 – 2010-09-08 19:20:12

+0

更新,感謝您的意見 – SwDevMan81 2010-09-08 19:26:46

相關問題