c# 字典存储的委托失效?

发布于:2025-04-21 ⋅ 阅读:(55) ⋅ 点赞:(0)

之前写了一个简单的事件工具类,使用字典来进行存储。
当时想的是使用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();

在这里插入图片描述