2013-10-07 53 views
0

在與我的老闆談話時,他似乎對.NET非常瞭解,他曾經說過我應該習慣於將控件的事件分配給控件設計師。是否應該將事件分配給控件

我不記得他的確切解釋,但我記得事件的線沒有包含在同一個線程中,它實際上並沒有完全清理垃圾收集?這是通過電話討論,我的耳機很爛,聽不清他說的究竟是什麼

我只是希望有人能詳細說明,或者指出我進一步閱讀的方向?

謝謝!

對於它的價值,我們正在使用.NET 3.5

+0

我理解的方式和我使用的經驗法則是,如果您在設計器中添加事件,那麼您就可以,不必將其刪除。但另一方面,如果您手動將其添加到後面的代碼中,則需要自行移除它以防止內存泄漏。 –

+0

@MarkHall哦,那是什麼?他曾經討論過導致內存泄漏的問題,我認爲這聽起來很奇怪,因爲默認情況下VS會在設計器中爲您創建代碼。 如你所說,我猜他肯定一直在談論我是否在代碼中手動分配它。 – sab669

+0

不是百分百肯定他在說什麼(我不在那裏:)),但那些是我使用的指導原則。 –

回答

3

有這個簡單的規則。僅當事件源對象超出事件訂閱者對象時,才需要顯式取消訂閱事件。

這幾乎從來沒有在Winforms應用程序中的情況,因爲窗體對象以及它包含的組件和控件同時死亡。該表單通過Controls集合提供了對控件的引用。控件可以通過其事件的委託對象引用表單,這可以保持表單對象的活性。你老闆的擔心。然而,垃圾收集器沒有像這樣的循環引用的問題,它與控件和事件委託對象同時收集表單對象。

有幾種選擇情況,其中事件源對象確實超出訂戶對象。 Application.Idle事件和SystemEvents事件的情況。值得注意的是這些事件是他們是static並因此保留了它們對於程序生命的訂閱對象引用,GC無法提供幫助。當關閉表單不會終止應用程序時,需要明確地取消訂閱這些事件。

如果您對自己的代碼有任何疑問,請使用內存分析器來驗證您的假設。

+0

感謝您的詳細回覆!正是我所希望的。 – sab669

相關問題