一章1.5-1.8介紹的是com、動態類型及.NET平台一些說明,每個心中都有自己的標准,聽一家之言,叫人不爽,相信自己有自己的標准和自己的編程理念就OK了,也不想碼那麼多說明性的文字,直接跳過吧,當然自己還是看過了。進入正題,這篇來說一下委托(在深入理解C#的同時,我也在學C++,委托確實和函數指針有相似的地方,大家也可以去了解下。)
委托的四個基本構成:
聲明委托使用delegate關鍵字
1 public delegate void Drive(string name);
如上,聲明了一個委托類型Drive,由System.MulticastDelegate派生,而System.MulticastDelegate又是繼承於System.Delegate,該類型有自己的方法和屬性。與該類型匹配的方法的簽名必需使用一個string類型作為參數和返回一個void類型(即不返回),可以是靜態方法或者一個實例方法。
1 public class Car
2 {
3 //實例方法
4 public void Drive(string name)
5 {
6 Console.WriteLine(name + "正在開車!!!");
7 }
8
9 //靜態方法
10 public static void StaticDrive(string name)
11 {
12 Console.WriteLine(name + "正在開車!!!");
13 }
14 }
如上,Car類中的Drive方法是一個實例方法,使用該方法前要有一個Car類型的實例,StaticDrive是一個靜態方法,使用類作用域便可以調用,且上述兩個方法的簽名均滿足上述委托對於方法簽名的要求。
接下來要創建一個Drive類型的委托實例,並且去調用。
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 //聲明兩個委托實例
7 Drive drive0, drive1;
8 Car car = new Car();
9
10 //對委托實例進行賦值,一個使用靜態方法,一個使用實例方法
11 drive0 = new Drive(Car.StaticDrive);
12 drive1 = new Drive(car.Drive);
13
14 //調用委托實例方法
15
16 //使用委托實例中的Invoke方法進行調用
17 drive0.Invoke("Leo");
18 //使用簡寫方法
19 drive1("DuDu");
20
21 Console.ReadKey();
22
23 }
24 }
上術只是對一個簡單操作的調用,委托更多的情況使用於多個操作聯合使用。可以使用Delegate.Combine和Delegate.Remove對操作的增減,一般使用簡寫方式+=和-=。
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 //聲明兩個委托實例
7 Drive drive0, drive1;
8 Car car = new Car();
9
10 //對委托實例進行賦值,一個使用靜態方法,一個使用實例方法
11 drive0 = new Drive(Car.StaticDrive);
12 drive1 = new Drive(car.Drive);
13
14 //調用委托實例方法
15
16 //使用委托實例中的Invoke方法進行調用
17 drive0.Invoke("Leo");
18 //使用簡寫方法
19 drive1("DuDu");
20
21
22 drive0 += drive1;
23 drive0.Invoke("Leo");
24
25 Console.ReadKey();
26
27 }
28 }
運行結果如下:

使用+=或者-=操作能更加方便,且利於理解。