標籤:cheng .com har ima 函數 sys 1.5 指標 ges
一章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 }
運行結果如下:
使用+=或者-=操作能更加方便,且利於理解。
參考頁面:
http://www.yuanjiaocheng.net/webapi/first.html
http://www.yuanjiaocheng.net/CSharp/Csharp-throw.html
http://www.yuanjiaocheng.net/CSharp/csharp-index.html
http://www.yuanjiaocheng.net/mvc/create-first-mvc.html
http://www.yuanjiaocheng.net/entity/dbset-class.html
http://www.yuanjiaocheng.net/mvc/mvc-helper-hiddenfield.html
http://www.yuanjiaocheng.net/Linq/linq-query-syntax.html
http://www.yuanjiaocheng.net/mvc/viewdata-in-asp.net-mvc.html
http://www.yuanjiaocheng.net/CSharp/csharp-extension-method.html
http://www.yuanjiaocheng.net/ASPNET-CORE/core-razor-layout.html
http://www.yuanjiaocheng.net/ASPNET-CORE/core-setup-entityframework.html
03.C#委託(二章1.1)