1.什麼是委托,為什麼要使用委托
我正在埋頭苦寫程序,突然想喝水,但是又不想自己去掉杯水而打斷自己的思路,於是我就想讓女朋友去給我倒水。她去給我倒水,首先我得讓她知道我想讓她干什麼,通知她之後我可以繼續寫自己的程序,而倒水的工作就交給了她。這樣的過程就相當於一個委托。
在程序過程中,當程序正在處理某個事件的時候,我需要另外的程序代碼去輔助處理一些事情,於是委托另一個程序模塊去處理,而委托就可以達到這種目的,我可以利用委托通知另外的程序模塊,該去調用哪個函數方法。委托其實就起到了這樣一個作用,將函數簽名傳遞到了另一個函數中。或許這樣講還是有些模糊,看看後面的具體實例。
2.委托的定義
delegate int Add(int num1,int num2);
delegate void ConvertNum(string result);
上面是定義兩個委托的例子,其實很簡單。聲明一個委托使用delegate關鍵字,上面分別是定義的帶返回值的委托和不帶返回值的委托,
兩個委托都有傳遞參數,當然也可以不傳遞參數。其實委托也是一個類,委托派生為System.MulticastDelegate,而System.MulticastDelegate
又繼承System.Delegate,如果你知道這個也就明白委托其實是一個特殊的類。
委托的簡單實用例子
1 public delegate string TeaDelegate(string spText);
2
3 public class DelegateSource
4 {
5 public void TestDelegate()
6 {
7 Operator op = new Operator();
8 TeaDelegate tea = new TeaDelegate(op.GetTea);
9 Console.WriteLine("去給我倒杯水");
10 Console.WriteLine();
11 string result=tea("去給我倒杯水");
12 Thread.Sleep(5000);
13 Console.WriteLine(result);
14 Console.WriteLine();
15 }
16 }
17
18 public class Operator
19 {
20 /// <summary>
21 /// 確定是否還有水
22 /// </summary>
23 private bool flag = true;
24
25 public string GetTea(string spText)
26 {
27 if (spText == "去給我倒杯水")
28 {
29 if (flag)
30 {
31 return "老公,茶來了";
32 }
33 else
34 {
35 return "老公,沒有水了";
36 }
37 }
38 return "等待.......";
39 }
40 }
輸出結果
上面使用最普通的一種方式來定義了一個委托的使用,這個例子雖然很簡單,但是能夠很形象的描述委托的使用。
3.委托的三種形式
(1).推斷
推斷委托例子
1 public delegate string TeaDelegate(string spText);
2
3 public class DelegateSource
4 {
5 public void TestDelegate()
6 {
7 Operator op = new Operator();
8 TeaDelegate tea = op.GetTea;
9 Console.WriteLine("去給我倒杯水");
10 Console.WriteLine();
11 string result=tea("去給我倒杯水");
12 Thread.Sleep(5000);
13 Console.WriteLine(result);
14 Console.WriteLine();
15 }
16 }
17
18 public class Operator
19 {
20 /// <summary>
21 /// 確定是否還有水
22 /// </summary>
23 private bool flag = true;
24
25 public string GetTea(string spText)
26 {
27 if (spText == "去給我倒杯水")
28 {
29 if (flag)
30 {
31 return "老公,茶來了";
32 }
33 else
34 {
35 return "老公,沒有水了";
36 }
37 }
38 return "等待.......";
39 }
40 }
在委托定義的例子中我們看到委托的使用方法是在委托實例化的時候指定的[new DelegateName(FunctionName)],這裡可能表述不是太但是代碼應該看得白了。 而委托的推斷,並沒有new 委托這個步驟,而是直接將Function 指定給委托。
(2).匿名函數
匿名委托例子
1 public delegate string TeaDelegate(string spText);
2
3 public class DelegateSource
4 {
5 public void TestDelegate()
6 {
7 Operator op = new Operator();
8 bool flag = true;
9 TeaDelegate tea = delegate(string spText)
10 {
11 if (spText == "去給我倒杯水")
12 {
13 if (flag)
14 {
15 return "老公,茶來了";
16 }
17 else
18 {
19 return "老公,沒有水了";
20 }
21 }
22 return "等待.......";
23 };
24
25 Console.WriteLine("去給我倒杯水");
26 Console.WriteLine();
27 string result=tea("去給我倒杯水");
28 Thread.Sleep(5000);
29 Console.WriteLine(result);
30 Console.WriteLine();
31 }
32 }
至於匿名委托,給人的感覺更為直接了,都不用顯示的指定方法名,因為根本沒有方法,而是指定的匿名方法。匿名方法在.NET 中提高了
代碼的可讀性和優雅性。對於更多操作較少的方法直接寫為匿名函數,這樣會大大提高代碼的可讀性。這裡有兩個值得注意的地方: 第一,不能使用
跳轉語句跳轉到該匿名方法外,第二 不能使用ref,out修飾的參數
(3).多播委托
多播委托例子
1 public delegate string TeaDelegate(string spText);
2
3 public class DelegateSource
4 {
5 public void TestDelegate()