正确使用动作和事件
本文关键字:事件 | 更新日期: 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
来完成。