c# 委托(Delegate)替换Switch
在日常开发中,不少时候都会遇到if else 、 if else if else,如果遇到逻辑多一点的业务,那么可以考虑用Switch来代替,代码效率和识别度都比if else会好上不少,但是如果遇到更多更复杂的逻辑,一个入口可能有几十个条件判断的时候用Switch来处理,那么结果是什么?满屏的Switch case break。
最近在做项目的时候就发现了这个问题,虽然不是满屏的,但是也有10多个,虽然容易阅读,但是看起来太吃力了,不断地滚动鼠标,于是就想到用委托来代替。
一、什么是委托
1、平时通俗一点理解就是,委托可以把方法当成参数一样传递,委托是一个"特殊"的类型。
2、委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
二、委托的优点和缺点
优点:1、解耦,降低代码耦合度 2、减少工作。(如上例子,不用满屏的Switch case break)
缺点:让代码变得难以理解,无法知道底层的代码操作逻辑。(就好比我们日常的工作,如果上级给你交办的事情你自己去做了,你自己清楚是怎么去做的,如果你委托另外一个人去帮你做了,那么你只知道事情做好了,并不知道具体怎么做的)。
三、使用地方场景
委托的使用最好是一次性使用,一次性使用的意思就是后期不需要去维护代码,不太改动的代码,否则时间太长,开发人员在不记得业务逻辑的情况下,会给自己挖坑,理解不了代码,把自己埋了。
归根结底就是代码最终的目的是实现功能,基本的原则是便于理解,委托能不使用就不要使用。
四、委托的使用
此处只简单的写了常规的委托和字典(Dictionary)+委托,因为字典加委托只需要比较一次(查一次hash表),替代Switch更好,更重要的是容易扩展。当然也可以通过工厂模式、反射等方法来替代。
1、创建委托函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public enum Status { A = 1, B = 2, C = 3 }
2、创建委托函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// Dictionary+delegate替换switch 3 /// </summary> 4 /// <param name="str"></param> 5 /// <param name="TaskID"></param> 6 /// <returns></returns> 7 public delegate string RelaceSwitch(string str, int TaskID); 8 private static Dictionary<Status, RelaceSwitch> ReplaceSwitch = new Dictionary<Status, RelaceSwitch>(); 9 10 /// <summary> 11 /// 常规委托 12 /// </summary> 13 /// <param name="str"></param> 14 /// <param name="it"></param> 15 public delegate void RelaceOne(string str, int it);
3、创建被委托函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static string AAA(string str, int TaskID) 2 { 3 Console.WriteLine("aaaa" + str + (TaskID)); 4 return str; 5 6 } 7 8 public static string BBB(string str, int TaskID) 9 { 10 Console.WriteLine("bbbb" + str + (TaskID)); 11 return str; 12 13 } 14 15 public static string CCC(string str, int TaskID) 16 { 17 Console.WriteLine("cccc" + str + (TaskID)); 18 return str; 19 20 } 21 /// <summary> 22 /// 常规委托函数 23 /// </summary> 24 /// <param name="str"></param> 25 /// <param name="it"></param> 26 public static void DDD(string str,int it) { 27 Console.WriteLine(str+it); 28 }
4、创建委托关系(字典+委托)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 private static void AdddDelegate() 2 { 3 ReplaceSwitch.Add(Status.A, AAA); 4 ReplaceSwitch.Add(Status.B, BBB); 5 ReplaceSwitch.Add(Status.C, CCC); 6 } 7 8 /// <summary> 9 /// 调用 10 /// </summary> 11 /// <param name="state"></param> 12 /// <param name="action"></param> 13 /// <param name="str"></param> 14 /// <param name="TaskID"></param> 15 private static void Exec(Status state, RelaceSwitch action, string str, int TaskID) 16 { 17 //Invoke 调用 18 string st = action.Invoke(str, TaskID); 19 }
5、调用委托
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 static void Main(string[] args) 2 { 3 //常规委托 4 RelaceOne one = new RelaceOne(DDD);//必须使用new关键字创建 5 one("555",11); 6 //字典+委托 7 AdddDelegate(); 8 Exec(Status.B, ReplaceSwitch[Status.B], "23424", 1998); 9 Console.ReadLine(); 10 }
以上就是对委托的初步理解,不喜勿喷,欢迎留言指正.