在日常開發中,不少時候都會遇到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 }
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);
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 }
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 }
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 }
以上就是對委託的初步理解,不喜勿噴,歡迎留言指正.