2011-06-09 37 views
9

我的理解是,在C#中連接的任何事件處理程序都需要這樣佈線。您是否需要「unwire」匿名函數/ lambda

Object myObject = new Object(); 
myObject.Event += EventHandler; //Wired 
myObject.Event -= EventHandler; //Unwired 

但是您是否需要取消以下代碼的連接?如果是這樣,怎麼樣?

Object myObject = new Object(); 
myObject.Event += (object sender, EventArgs e) => { }; //Wired 
myObject.Event -= ????? //Unwire? How? 

我的假設是否定的?

+0

你能否澄清你的理解是什麼:

如下您可以刪除嗎? **(*)**代表 – AakashM 2011-06-09 11:11:27

回答

10

是的,你需要(*),你需要做的是這樣的:

Object myObject = new Object(); 
EventHandler handler = (object sender, EventArgs e) => { }; 
myObject.Event += handler; //Wired 
myObject.Event -= handler; //Unwired 

一個解釋見here

(*)
由於垃圾收集,您不需要這樣做。如果您不希望事件再次致電您的處理程序,則需要執行此操作。

UPDATE:
澄清一點:
的唯一原因,你爲什麼要無線化的事件處理程序是定義事件處理程序的對象可以被垃圾收集。
想想下面的例子:

  • 你有一個類PowerSource與事件BlackOut
  • 你有一個LightBulb類,只要有權力,它將會開啓。它有一個方法ConnectToPowerSource。此方法訂閱提供的PowerSourceBlackOut事件。
  • 您有一個包含燈泡

現在,只需從列表中刪除一個燈泡不會讓它獲得垃圾回收的集合,因爲PowerSource仍保持參照在LightBulb實例在其BlackOut事件。只有從BlackOut事件中取消註冊LightBulb後,LightBulb纔會被垃圾收集。

+0

+1。因爲你從來沒有**取消聯繫,你只需要或不需要。 – 2011-06-09 10:47:24

+1

你的「(*)」句子意味着什麼?只要事件處理程序存在,它將保留收集的所有捕獲的本地變量。所以你也需要這樣做,因爲GC也是如此(至少如果該事件的發佈者的壽命比消費者長得多)。但是,當然,脫線最常見的原因是你不希望你的事件處理程序再被調用。(我不是downvoter) – CodesInChaos 2011-06-09 10:49:34

+0

我的意思是:如果myObject不再需要,並且所有引用都消失了,它將被垃圾收集,以及分配給它的事件處理程序的匿名方法。如果仍然使用myObject,但不希望不再調用特定的事件處理程序,則需要取消接線,否則將導致垃圾回收,如果未再保存對其的引用。我想,我想說的是:你不需要取消它,因爲myObject被收集。但是,這與匿名方法無關,所有事件處理程序都是如此。 – 2011-06-09 10:54:04

1
Object myObject = new Object(); 
EventHandler h = (object sender, EventArgs e) => { }; //Wired 
myObject.Event += h; 
myObject.Event -= h; 

或者說,在處理程序,以無線化:

Object myObject = new Object(); 
EventHandler h = null; //need to declare h to use it in the following line 
//compiler/resharper will complain about modified closure 
h = (object sender, EventArgs e) => { myObject.Event-=h; }; 
myObject.Event += h; 
2

是的,你必須。因爲事件是一個強大的參考,您的事件處理程序將繼續被調用。 - 你是什麼「必須」的意思

EventHandler handler = (s,e) => { DoSomething(); } 
myObject.Event += handler; 
myObject.Event -= handler; 
+0

如果你希望處理程序不再被調用**,你必須**。如果你不在乎,你不需要。 – 2011-06-09 10:49:10