2013-03-13 41 views
9

我有點新c#所以請,如果你發現它瑣碎忽視。我看到以下「怪異」代碼。行動的正確使用和活動

任何人都可以闡明這一點光。

public event Action _action; 

if (_action != null)    
{ 
    foreach (Action c in _action.GetInvocationList()) 
    { 
     _action -= c; 
    } 
} 

特地_action -= c;部分。

+0

看一看這太問題:http://stackoverflow.com/questions/447821/how-do-i-unsubscribe-all-handlers-from-an-event-for-a - 特別級 - 在-c中 – 2013-03-13 17:51:28

+0

檢查出http://stackoverflow.com/questions/1431359/event-action-vs-event-eventhandler的動作vs EventHandler的概述 – PHeiberg 2013-03-13 18:04:18

回答

22

委託可以是一個代表一個以上的功能。如果你有一個委託alpha委託給Alpha(),並委託beta委託給Beta()然後gamma = alpha + beta;是調用Alpha()然後Beta()的委託。 gamma - beta產生一個代表,調用Alpha()。這是一個奇怪的功能,完全坦白。

你已經發布的代碼是離奇。它說:「經過在行動功能列表中,產生代表一個整體一堆調用越來越少的功能,然後最後一個代表,什麼也不做分配給action。究竟爲什麼會有人這樣做?只是分配nullaction並用它做

2

這是刪除操作的處理程序。

+3

這是一個無益的答案 – 2013-03-13 17:50:39

+5

@SamIam:是?這正是OP所要求的。 – 2013-03-13 17:51:26

+2

@SamIam - yup - 正是它做的。 – 2013-03-13 17:52:13

6
public event Action _action; //an event 


if (_action != null) // are there any subscribers? 

{ 
     foreach (Action c in _action.GetInvocationList()) //get each subscriber 
     { 
      _action -= c; //remove its subscription to the event 
     } 
} 
+0

感謝您的回覆。 '公共事件行動_action;'這有點好嗎?意思不應該採取行動參數從1到16.不應該像'公共事件行動<..> _action;' – saam 2013-03-13 18:03:39

+0

如果你需要某種參數的行動,是的。但BCL中有兩個版本的Action類。你在這裏看到的非泛型(Action)和泛型(Action <>)。不過,我建議使用事件EventHandler <>的標準事件約定。看到我對你的問題的評論。 – PHeiberg 2013-03-13 18:07:28

+0

非常感謝您的回覆! – saam 2013-03-13 18:14:01

2

事件實際上是MultiCastDelegate。當您「附加」一個事件處理程序時,它會添加對它的引用InvocationList

上面的代碼將InvocationList中的每個事件處理程序從事件中分離 - 實質上是「清除」事件,也可以通過說_action = null來完成。