2009-08-27 96 views
10

從VS中的Designer中,假設你雙擊一個按鈕並生成這個Click事件處理程序。我必須取消訂閱所有事件處理程序嗎?

訂閱代碼位於designer.cs中。

我想知道,在處置表單必須取消事件?

此外,窗體中的所有控件都將在表單處理時處理?它實際上是遞歸地在每個控件上調用dispose?

回答

15

如果您掛鉤了自己的事件,則無需在Dispose上解除事件。

如果您將某個事件掛接到另一個對象中,您只需要擔心。其原因是事件掛鉤使用戶保持參考活動。如果你不能解開鉤子,那麼只要可觀察物仍然存在,你就不會收集垃圾。

當你勾起你自己的事件時,你有一個對自己的引用,這是循環的,因此你不需要擔心它。

由於這個原因,我開始支持更鬆散耦合的事件模式。這是.NET中內存泄漏的第一位。我更喜歡Event Aggregator模式(與weak events)。

+0

感謝您的好解釋。當你對自己有吸引力時,不要脫鉤,這是完美的感覺。 – pdiddy 2009-08-27 15:06:17

1

只要事件處理程序代碼的形式本身,那麼你就不會需要退訂的事件 - 因爲不會有懸空的事件處理程序的控件形式本身將遭到破壞

2

關於「它實際上是否會遞歸地處理每個控件?」的問題,答案是肯定的。

一個簡單的測試可以通過在控件的Dispose方法中放置一個斷點來完成。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Controls.Add(new SuperButton()); 
    } 
} 

public class SuperButton : Button 
{ 
    protected override void Dispose(bool disposing) 
    { 
     //Place breakpoint on the line below 
     base.Dispose(disposing); 
    } 
} 
相關問題