c# – 在删除代理链之前是否有必要检查处理程序是否存在?

c# – 在删除代理链之前是否有必要检查处理程序是否存在?,第1张

概述我有一个基于委托的消息传递系统的小片段,您可以订阅和取消订阅事件处理程序,并提升新事件. 在我的Unsubscribe方法中,我检查以确保处理程序首先存在,然后再删除它. 我的问题是:这项检查是否必要?即我不能这样做: dic[type] -= handler; 无: if (handler exists) dic[type] -= handler; 如果是这样,为什么? – 我尝试了检查 我有一个基于委托的消息传递系统的小片段,您可以订阅和取消订阅事件处理程序,并提升新事件.

在我的Unsubscribe方法中,我检查以确保处理程序首先存在,然后再删除它.

我的问题是:这项检查是否必要?即我不能这样做:

dic[type] -= handler;

无:

if (handler exists)    dic[type] -= handler;

如果是这样,为什么? – 我尝试了检查而不是检查,它们都产生了相同的实际结果.不知道为什么我更愿意使用其中任何一个.

码:

public abstract class GameEvent { }    private static class EventManagerInternal<T> where T : GameEvent    {        private static Dictionary<Type,Action<T>> dic = new Dictionary<Type,Action<T>>();        public static voID Subscribe(Action<T> handler)        {            Type type = typeof(T);            if (!dic.ContainsKey(type)) {                dic[type] = handler;                Console.Writeline("Registered new type: " + type);            }            else {                // make sure the handler doesn't exist first                bool hasHandlerSubscribed = dic[type].GetInvocationList().Any(h => h.Equals(handler));                if (hasHandlerSubscribed) {                    Console.Writeline(handler.Method.name + " has already subbed to an event of type " + type);                    return;                }                dic[type] += handler;            }            Console.Writeline("Method " + handler.Method.name + " has subbed to receive notifications from " + type);        }        public static voID Unsubscribe(Action<T> handler)        {            Type type = typeof(T);            // make sure the type exists            if (!dic.ContainsKey(type)) {                Console.Writeline("Type " + type + " hasn't registered at all,it doesn't have any subscribers... at least not in my book...");                return;            }            // get the methods that the delegate points to            // to see if the handler exists or not            bool exist = dic[type].GetInvocationList().Any(h => h.Equals(handler));            if (!exist) {                Console.Writeline("Method " + handler.Method.name + " hasn't registered at all,for notifications from " + type);                return;            }            // remove the handler from the chain            dic[type] -= handler;            Console.Writeline("handler " + handler.Method.name + " has been removed. it won't take any notifications from " + type);            // if there's no more subscribers to the "type" entry,remove it            if (dic[type] == null) {                dic.Remove(type);                Console.Writeline("No more subscribers to " + type);            }        }        public static voID Raise(T e)        {            Action<T> handler;            if (dic.TryGetValue(e.GetType(),out handler)) {                handler.Invoke(e);            }        }    }

示例用法:(通过包装器 – 我只是认为Class.DoSomething< T>比Class< T> DoSomething更好 – 有一个很好的理由我为什么不得不去做这个设置:)不是这里的重点…… )

Player p = new Player();        EventManager.Subscribe<OnRename>(OnRenameHandler);        EventManager.Subscribe<OnRename>(AnotheronRenameHandler);        EventManager.Raise(new OnRename());        EventManager.Unsubscribe<OnRename>(OnRenameHandler);        etc
解决方法

My question is: is this check necessary?

不它不是.

why?

这很简单,检查由您正在使用的运算符完成.如果要删除的处理程序不存在,而不是抛出异常,它专门设计为什么都不做.

总结

以上是内存溢出为你收集整理的c# – 在删除代理链之前是否有必要检查处理程序是否存在?全部内容,希望文章能够帮你解决c# – 在删除代理链之前是否有必要检查处理程序是否存在?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存