2013-03-13 47 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来完成。