分分搞懂c#中的委托;
不說廢話,不來虛的概念,不管代碼是否有意義,看我的優化之路,你會理解委托了;
源代碼1
public class test { //我們不管代碼是否有意義,我們直接看代碼重構和一步步優化的過程 int flage = 1; public void show(int a) { if (flage == 1) { do1(a); } else if (flage == 2) { do2(a); } else if (flage == 3) { do3(a); } else if (flage == 4) { do4(a); } else { } } public void do1(int val) { } public void do2(int val) { } public void do3(int val) { } public void do4(int val) { } }
優化一:
public enum flag { a = 1, b = 2, c = 3, d = 4 } public class test2 { public void show(int a, flag f) { switch (f) { case flag.a: do1(a); break; case flag.b: do2(a); break; case flag.c: do3(a); break; case flag.d: do4(a); break; } } public void do1(int val) { } public void do2(int val) { } public void do3(int val) { } public void do4(int val) { } }
優化二(委托“現身了”)
public delegate void mydelegate(int val); public class test3 { public void show(int a,mydelegate de ) { de(a); } public void do1(int val) { } public void do2(int val) { } public void do3(int val) { } public void do4(int val) { } } class Program { static void Main(string[] args) { test3 t = new test3(); t.show(12,t.do2); } } }
哈哈哈,這下明白了撒!(我們將方法名,當成了一個參數來傳遞滴呀~)
現在我們才來總結概念!
委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。
我們也可以將方法綁定到委托上滴呀;
還是直接上代碼:
namespace Delegate003 { public delegate void myDelegate(string val); class Program { public static void show(string val,myDelegate de) { de(val); } public static void do1(string val ) { Console.WriteLine("do1.."+val); } public static void do2(string val) { Console.WriteLine("do2..."+val); } public static void do3(string val) { Console.WriteLine("do3...'"+val); } static void Main(string[] args) { //使用方式一 myDelegate de1,de2; string val="sth"; de1 = do1; de2 = do2; show(val, de1); show(val, de2); Console.ReadLine(); //使用方式二 //可以將多個方法賦給同一個委托,或者叫將多個方法綁定到同一個委托,當調用這個委托的時候,將依次調用其所綁定的方法 myDelegate de; string val2="something"; de = do1; de += do2; //使用-=就是取消綁定 de += do3; show(val2, de); Console.ReadLine(); //使用方式三,繞過我們的show方法,直接調用; myDelegate directMy; string directVal = "direct"; directMy = do1; directMy(directVal); //直接通過調用委托來使用滴呀; //使用方式四; myDelegate delegate1 = new myDelegate(do1); string val4 = "val4"; delegate1(val4); //使用方法五 } } }
現在再來看看總結我們的概念滴呀;
使用委托可以將多個方法綁定到同一個委托變量,當調用此變量時(這里用“調用”這個詞,是因為此變量代表一個方法),可以依次調用所有綁定的方法。