c# 字典存储的委托失效?
之前写了一个简单的事件工具类,使用字典来进行存储。
当时想的是使用TryGetValue少进行一次遍历。在项目使用中发现只有一个事件生效。后续在注册的事件无法生效。
当时的写法
private readonly Dictionary<int, Action<IEventMessage>> mListeners;/// <summary>/// 注册事件/// </summary>public IUnRegister Register<TEvent>(Action<IEventMessage> listener) where TEvent : IEventMessage{int eventId = typeof(TEvent).GetHashCode();if (mListeners.TryGetValue(eventId,out var listeners)){listeners += listener;}else{mListeners.Add(eventId, listener);}return new CustomUnRegister(() => UnRegister<TEvent>(listener));}
更改后的写法
private readonly Dictionary<int, Action<IEventMessage>> mListeners;/// <summary>/// 注册事件/// </summary>public IUnRegister Register<TEvent>(Action<IEventMessage> listener) where TEvent : IEventMessage{int eventId = typeof(TEvent).GetHashCode();if (mListeners.ContainsKey(eventId)){mListeners[eventId] += listener;}else{mListeners.Add(eventId, listener);}return new CustomUnRegister(() => UnRegister<TEvent>(listener));}
deepseek的回答:
可以使用下面代码验证上述回答
Action action = () =>{Debug.Log("action");};Action action2 = action;action += () =>{Debug.Log("action +=");};action.Invoke();Debug.Log("-------------------------------------------");action2.Invoke();