1、委託:其實就是方法的多態,可以更確切的說是方法的指標
2、委託是參考型別,這與類和介面相似。
3、一個委託可以指向多個方法,方法的簽名相同,委託才能指向它
4、介面只能一次可以指向一個執行個體,而委託可以指向多個方法;此刻調用一個委託可以調用多個方法,也即是委託鏈
5、使用委託的步驟:
步驟1:聲明委託
1定義委託:可訪問性 delegate 傳回型別 (參數列表);
2定義方法:可訪問性 傳回型別 (參數列表)
//以上兩點根據參數類型和傳回型別進行匹配,必須兩者相同才能委託指向方法,也即函數的簽名必須相同
public delegate void Job();
注意:其實委託相當於一個類所以定義委託一定要定義在方法的外面。
步驟2:建立委託調用的方法
//建立一個類,裡麵包含兩個方法
class School
{
public void teacher()
{
Console.WriteLine("老師的工作是教學生學習!");
}
public void student()
{
Console.WriteLine("學生的工作是好好學習!");
}
}
步驟3:調用委託進而調用指向的方法
static void Main(string[] args)
{
School school = new School();
Job j = new Job(school.teacher); //執行個體化委託的時候必須指明其建構函式的參數,該參數不是值,不是引用,而是要指向方法的方法名
j += new Job(school.student); //繼續加入委託鏈,其實相當於加入到委託數組裡面,就像是一個方法數組,即數組裡面儲存了多個方法
Console.WriteLine("此刻該委託鏈中有{0}個方法",j.GetInvocationList().Length);
// j.GetInvocationList().Length調用委託的一個方法擷取委託數組的長度,也即獲得委託方法的個數。
j();
j -= new Job(school.student); //當然也可以從委託鏈中減去相應不想用的方法
Console.WriteLine("此刻該委託鏈中有{0}個方法", j.GetInvocationList().Length);
j();
}
5、委託的廣播
使用+=委託中添加一個方法,使用- =使委託中減少一個方法,其實委託鏈就存在一個委託數組中,數組中存的是方法的引用。+=相當於添加一個委託的引用,-=相當於減少一個委託的引用。
單路廣播:一個委託指向一個方法
多路廣播:一個委託指向多個方法
注意:對於單路廣播可以使用傳回值,而對於多路廣播,方法的傳回值可能就不知一個,所以一般不建議帶傳回值,若必須有那麼委託接收的是委託鏈最後的那個方法的傳回值。
6、委託類的成員
以下方法可以簡單的瞭解下,是用編程的方式實現委託的建立,添加委託的方法,減去等。
7、委託增強
1、匿名方法:字面上講沒有名字的方法,能省略參數列表,意味著可以將匿名方法轉換為帶有各種簽名的委託。可以把代碼塊傳遞作為委託的參數,而這個代碼塊還是相當於原來類裡面的一個方法。好處:通過匿名方法不必建立單獨的一個方法,建立類,減少了執行個體化委託所需要的代碼系統開銷。
如:使用匿名方法實現老師工作的方法。
Job jobdelegate = delegate()
{
Console.WriteLine("老師的工作是教學生學習!"); };
jobdelegate();//使用該委託
僅僅使用一次的方法一般不要寫在類裡面,避免冗餘,再如來個數相加:
public delegate int Add(int a, int b);//定義委託
Add add = delegate(int m, int n)
{
return m + n;
};
int result=add(1,2);
Console.WriteLine(result);
8、協變和逆變
協變和逆變都是與繼承有關係的
(1)協變:允許方法具有的派生傳回型別比委託中定義的多,比如說:
定義兩個類,男人繼承於人類:class people{}; class men:people{};
定義委託:public delegate people MethodPeople();
委託可以返回people,也可以返回men;即 MethodPeople m1=delegate(){return man;};
可以這麼簡單的理解:委託類型是父類類型,而委託調用方法時方法傳回型別可以使子類類型,當然也可以是父類類型。
(2)逆變:允許方法具有衍生類別參數類型比委託類型中的更少
字面上就能理解是和逆變相反的,說白了就是委託定義的子類類型或者參數為子類類型,而返回的可以使父類類型,或者參數傳入的時父類類型。
個人理解:其實這就是方法傳回型別和方法參數的多態,僅做參考。
協變和逆變用的地方不是很多,簡單瞭解就行。