一章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 }
運行結果如下:
使用+=或者-=操作能更加方便,且利於理解。