【问题标题】:Why is C# is not removing listeners from an Action delegate?为什么 C# 没有从 Action 委托中删除侦听器?
【发布时间】:2018-12-18 22:31:27
【问题描述】:

所以我在 Unity 中为游戏构建了一个非常基本的事件管理器,并且我将 Actions 的引用保存在这样的字典中:

public void SubscribeToAction(string actionKey, Action<object> listener)
{
    Action<object> action;
    if(actionList.TryGetValue(actionKey, out action)){
        action += listener;
    }else{
        action += listener;
        actionList.Add(actionKey, action);
    }
}

但是发生的情况是,即使我在退出场景时取消订阅,我发现正在对旧听众进行调用并且我得到一个空异常:

public void UnSubscribe(string actionKey, Action<object> listener)
{
    Action<object> action;
    if(actionList.TryGetValue(actionKey, out action)){
        action -= listener;
    }
}

我找到的唯一解决方案是在退出场景时清除整个字典并在 start() 方法上再次添加订阅。

【问题讨论】:

  • 您是否为侦听器使用 lambda 表达式?例如。 SubscribeToAction("blah", (obj) =&gt; Debug.Log(obj))?

标签: c# unity3d delegates action


【解决方案1】:

action += listener;action -= listener; 只是更改了局部变量 action。他们没有改变字典中的值。如果您想更改字典中的值,您需要将该字典中的值设置,在您的情况下,设置为 action 的值。

【讨论】:

  • 对!谢谢你的帮助。这是一个非常愚蠢的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多