委托與事件是C#中歷史比較悠久的技術,從C#1.0開始就有了,核心作用就是將方法作為參數(變數)來傳遞和使用。其中委托是基礎,需要熟練掌握,編程中常用的Lambda表達式、Action、Func都是委托,包括事件也是基於委托實現的。 ...
委托與事件是C#中歷史比較悠久的技術,從C#1.0
開始就有了,核心作用就是將方法作為參數(變數)來傳遞和使用。其中委托是基礎,需要熟練掌握,編程中常用的Lambda表達式、Action、Func都是委托,包括事件也是基於委托實現的。
01、認識委托delegate
1.1、什麼是委托?
委托是一種用來包裝方法的特殊類型,可以將方法包裝為對象進行傳遞、調用,類似函數指針。delegate 關鍵字用來定義一個委托類型,語法類似方法申明,可以看做是一個“方法簽名模板”,和方法一樣定義了方法的返回值、參數。
- 用
delegate
定義的委托是一個類,繼承自 System.MulticastDelegate、System.Delegate,“方法名”就是委托類型的名稱。 - 委托的使用同其他普通類型,實例指向一個方法的引用,該方法的申明和委托定義的“方法簽名模板”須匹配(支持協變逆變)。
- 委托支持連接多個委托(方法),稱為多播委托(MulticastDelegate),執行時都會調用。
public delegate void Foo(string name); //申明一個委托類型
void Main()
{
Foo faction; //申明一個Foo委托(實例)變數
faction = DoFoo; //賦值一個方法
faction += str => { Console.WriteLine($"gun {str}"); }; //添加多個"方法實例"
faction += DoFoo; //繼續添加,可重覆
faction("sam"); //執行委托,多個方法會依次執行
faction.Invoke("zhang"); //同上,上面調用方式實際上還是執行的Invoke方法。
}
private void DoFoo(string name){
Console.WriteLine($"hello {name}");
}
委托的主要使用場景:核心就是把方法作為參數來傳遞,分離方法申明和方法實現。
- 回調方法,包裝方法為委托,作為參數進行傳遞,解耦了方法的申明、實現和調用,可以在不同的地方進行。
- Lambda表達式,這是委托的簡化語法形式,更簡潔,比較常用。
- 事件,事件是一種特殊的委托,是基於委托實現的,可以看做是對委托的封裝。