正确使用动作和事件

本文关键字:事件 | 更新日期: 2023-09-27 18:03:49

我对c#有点陌生,所以如果你觉得它微不足道,请忽略。我看到了下面的"奇怪"代码。

有谁能解释一下吗?

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

特别是_action -= c;部分

正确使用动作和事件

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

你发布的代码很奇怪。它说"遍历运行中的函数列表,生成一大堆调用越来越少函数的委托,然后最后将一个不做任何事情的委托分配给action。"到底为什么会有人这么做?把null赋值给action就行了

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
        }
}

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

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

上面的代码是将InvocationList中的每个事件处理程序从事件中分离出来——本质上是"清除"事件,这也可以通过输入_action = null来完成。