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

以上就是對委託的初步理解,不喜勿噴,歡迎留言指正.

  

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