標籤:c# delegate 委託
本篇部落格和大家分享一下C#中的委託。
委託是什麼
我們先思考這麼一個問題,如果我現在想寫一個Person類,定義如下:
public class Person{ public string Name { get; set; } public int Age { get; set; } public void ZhuangBi() { //第一步,找到話題 //第二步,找到一個能夠聊天的人 Console.WriteLine( "I am newbility"); }}
為了使程式更加靈活,我不想在ZhuangBi這個方法中寫具體的實現,那麼問題來了,第一步和第二步怎麼實現?我們可以抽象出一個介面,然後依賴注入,不過這不在本篇討論的範圍內。我們能不能給ZhuangBi這個方法添加兩個參數,這兩個參數分別指向一個方法,也就是說,外界調用這個方法時,會傳進來兩個方法,一個方法負責找到話題,另一個方法負責找到能聊天的人。可是,怎麼才能把方法當成參數來傳遞呢?參數的類型是什麼呢?
在.net 的世界裡,委託(delegate)為瞭解決這個問題誕生了。委託是一種類型,能夠指向一個方法。委託更準確的定義是:委託是表示對具有特定參數列表和傳回型別的方法的引用的類型。
如何定義委託
為瞭解決上面的問題,我們來定義一個委託,為了簡單起見,參數列表和傳回值都為空白
public delegate void MyDelegate();
然後改造一下ZhuangBi這個方法,改造後的代碼如下
public class Person{ public string Name { get; set; } public int Age { get; set; } public void ZhuangBi(MyDelegate findTopic, MyDelegate findPerson) { //首先,找到話題 findTopic(); //然後,找到一個能夠聊天的人 findPerson(); Console.WriteLine("I am newbility"); }}
如何使用委託
最後我們再寫一個類,來調用這個Person類,並傳遞兩個方法過來
class Program{ static void Main(string[] args) { Person p = new Person(); MyDelegate delegate_FindTopic = FindTopic; MyDelegate delegate_FindPersonToTalk = FindPersonToTalk; p.ZhuangBi(delegate_FindTopic, delegate_FindPersonToTalk); } static void FindTopic() { Console.WriteLine("MongoDB is not too bad"); } static void FindPersonToTalk() { Console.WriteLine("find a geek"); }}
運行結果如下
MongoDB is not too badfind a geekI am newbility
使用系統定義的委託
在很多時候,我們可以使用系統已經定義好的委託,System.Action是參數列表和傳回值都為空白的委託,定義如下
public delegate void Action();
Func<> 是一個範型委託,有17個重載,最多可以定義16個範型參數。這兩個委託應該能滿足幾乎所有的應用情境了。
c# 委託