正确使用Action和Events

时间:2013-03-13 17:47:42

标签: c# events

我对c#有点新意,所以如果你发现它很微不足道请忽略。我看到了以下“怪异”的代码。

任何人都可以对此有所了解。

public event Action _action;

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

特别是_action -= c;部分。

4 个答案:

答案 0 :(得分:22)

委托可以是多个功能的委托。如果您有委派给alpha的委托Alpha()和委托给beta的委托Beta(),那么gamma = alpha + beta;是一个致电Alpha()的代表然后Beta()gamma - beta生成一个调用Alpha()的委托。这是一个奇怪的功能,坦率地说。

您发布的代码是奇怪的。它说“通过行动中的函数列表,生成一大堆代理,调用越来越少的函数,然后最终分配一个对action无效的委托。为什么人们会这样做呢?将null分配给action并完成。

答案 1 :(得分: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
        }
}

答案 2 :(得分:2)

它正在删除操作的处理程序。

答案 3 :(得分:2)

事件实际上是MultiCastDelegate。当您“附加”事件处理程序时,它会添加对它的引用InvocationList

上面的代码将InvocationList中的每个事件处理程序与事件分离 - 基本上是“清除”事件,这也可以通过说_action = null来完成。