C#中的委托與事件是很重要的概念,要學好C#,必須沖破這一關。
1.委托
關鍵字delegate,委托,它與類、枚舉、結構、接口一樣,也是一種類型。
由于委托是代表了一類具有相同參數列表和返回值的函數,委托定義的變量用于保存具有相同簽名的函數實體,它可以指代任何函數。所以,我們說類是對象的抽象,那么委托就可以看成是函數的抽象。
委托的好處:
1.將方法動態地賦給參數,可以避免在程序中大量使用if-else(switch-case)語句,使程序具有良好的可擴展性。
2.可以把函數本身的處理邏輯抽象出來,由調用者決定最終使用什么樣的邏輯去處理。
委托的用法,請看下面的代碼
1 //委托與類、枚舉、結構、接口一樣,也是一種類型 2 //一個委托代表了具有相同參數列表和返回值的所有函數 3 delegate int GetCalculatedValueDelegate(int x, int y); 4 delegate void GreetingPeople(); 5 6 static int AddValue(int x,int y) 7 { 8 return x + y; 9 } 10 11 static int SubValue(int x, int y) 12 { 13 return x - y; 14 } 15 16 static int MulValue(int x, int y) 17 { 18 return x * y; 19 } 20 21 static void EnglishGreating() 22 { 23 Console.WriteLine("Hello"); 24 } 25 26 static void ChineseGreeting() 27 { 28 Console.WriteLine("你好"); 29 } 30 31 //委托作為函數的參數來使用 32 //一個委托實體可以指代任何函數 33 static int CalculateValue(GetCalculatedValueDelegate fun,int x,int y) 34 { 35 return fun(x, y); 36 } 37 38 static void Main(string[] args) 39 { 40 Console.WriteLine("委托作為參數來使用"); 41 Console.WriteLine(CalculateValue(SubValue, 50, 20)); 42 43 Console.WriteLine("委托使用 += 和 -="); 44 GetCalculatedValueDelegate de = new GetCalculatedValueDelegate(AddValue); 45 de += SubValue; 46 de -= AddValue;//取消對AddValue方法的綁定 47 Console.WriteLine(de(20, 20)); 48 49 Console.WriteLine("給一個委托綁定多個方法"); 50 GetCalculatedValueDelegate d = AddValue;//給委托賦值 51 d += SubValue; //給委托再綁定一個函數 52 d += MulValue; //給委托再綁定一個函數 53 Console.WriteLine(d(100, 30)); 54 55 GreetingPeople greeting = null; 56 greeting += EnglishGreating; 57 greeting += ChineseGreeting; 58 greeting(); 59 }
運行結果:
因為委托也是一種類型,所以我們可以進行操作的運算符主要有 = (賦值操作)、 += (把一個方法綁定到一個委托變量上)、 -=(取消綁定)。 要注意的是:無返回值的委托,你給它注冊多少個方法,它就執行多少個方法,而有返回值的委托,同樣注冊多少個方法就執行多少個方法,但返回的是最后一個方法的返回值。所以上面的程序中,我們給委托d綁定了3個有返回值的方法,但最終返回的是MulValue的返回值;我們給委托greeting綁定了2個方法,最終我們看到了這兩個方法的執行結果。
關于委托的+=和-=的工作原理,請查看 http://www.jb51.net/article/59449.htm
委托的缺點:在上面的程序中,我們可以隨意地給委托進行賦值,破壞了程序的封裝性,所以接下來該事件出場了。
接下來請看:委托與事件——事件。
文章列表