文章出處

  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

  委托的缺點:在上面的程序中,我們可以隨意地給委托進行賦值,破壞了程序的封裝性,所以接下來該事件出場了。

  接下來請看:委托與事件——事件。

 


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()