從VS中的Designer中,假設你雙擊一個按鈕並生成這個Click事件處理程序。我必須取消訂閱所有事件處理程序嗎?
訂閱代碼位於designer.cs中。
我想知道,在處置表單必須取消事件?
此外,窗體中的所有控件都將在表單處理時處理?它實際上是遞歸地在每個控件上調用dispose?
從VS中的Designer中,假設你雙擊一個按鈕並生成這個Click事件處理程序。我必須取消訂閱所有事件處理程序嗎?
訂閱代碼位於designer.cs中。
我想知道,在處置表單必須取消事件?
此外,窗體中的所有控件都將在表單處理時處理?它實際上是遞歸地在每個控件上調用dispose?
如果您掛鉤了自己的事件,則無需在Dispose上解除事件。
如果您將某個事件掛接到另一個對象中,您只需要擔心。其原因是事件掛鉤使用戶保持參考活動。如果你不能解開鉤子,那麼只要可觀察物仍然存在,你就不會收集垃圾。
當你勾起你自己的事件時,你有一個對自己的引用,這是循環的,因此你不需要擔心它。
由於這個原因,我開始支持更鬆散耦合的事件模式。這是.NET中內存泄漏的第一位。我更喜歡Event Aggregator模式(與weak events)。
只要事件處理程序代碼的形式本身,那麼你就不會需要退訂的事件 - 因爲不會有懸空的事件處理程序的控件形式本身將遭到破壞
關於「它實際上是否會遞歸地處理每個控件?」的問題,答案是肯定的。
一個簡單的測試可以通過在控件的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);
}
}
感謝您的好解釋。當你對自己有吸引力時,不要脫鉤,這是完美的感覺。 – pdiddy 2009-08-27 15:06:17