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、创建委托函数

public enum Status
    {
        A = 1,
        B = 2,
        C = 3
    }
View Code

2、创建委托函数

 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);
View Code

3、创建被委托函数

 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         }
View Code

4、创建委托关系(字典+委托)

 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         }
View Code

5、调用委托

 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         }
View Code

以上就是对委托的初步理解,不喜勿喷,欢迎留言指正.

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章