Delegate 委托
委托聲明:public delegate int MyDelegate (string s);
用delegate關鍵字定義委托,它是對特定傳回類型和參數的方法的抽象,是你定義的一種新資料類型,它與int、class是一樣的都是資料類型。符合類型的方法均可為其指派。方法是一種實作特定功能的操作行為,可以簡單地看做,具有特定傳回類型和參數的代碼塊。特定的傳回類型和參數即對應一種特定的委托類型。
注意:定義一個委托相當于定義一個新類,所有可以定義類的地方都可以定義委托。
委托是一個類,它定義了方法的類型,使得可以将方法當作另一個方法的參數來進行傳遞,這種将方法動态地賦給參數的做法,同時使得程式具有更好的可擴充性。
把方法指派給委托,調用委托就相當于調用方法,委托與方法等效,是以也可以将方法定義直接指派給委托。
delegate void NumberChanger(int n);
NumberChanger nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
}; //方法定義指派委托
//上述寫法等價于
Action<int> nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
匿名方法:
因為沒有方法名稱,是以稱為匿名方法——最常見的用法是執行個體化委托,即給委托變量指派,或者說給委托配置設定方法。
匿名函數可以用來初始化委托,可在需要委托類型的任何地方使用。
多點傳播委托:一個委托配置設定多個方法,一次執行多個方法
預定義委托:——泛型委托
Action 無傳回值委托 Action a = Test; Action<string> a = PrintStr;
Func 有傳回值委托 Func<int> b = Test1; Func<string, int> a = Test2;
———————————————————————————————————————————————————————
Lambda 表達式
Lambda 表達式是一個匿名函數,由匿名函數簡化而來,它可以包含表達式和語句,并且可用于執行個體化委托。
Lambda表達式基于數學中的λ演算得名,C#的Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為“goes to”。
文法格式:(參數清單)=>表達式或語句塊
合法的Lambda表達式:
1、(x, y) => x * y //多參數,隐式類型=> 表達式
2、x => x * 5 //單參數, 隐式類型=>表達式
3、x => { return x * 5; } //單參數,隐式類型=>語句塊
4、(int x) => x * 5 //單參數,顯式類型=>表達式
5、(int x) => { return x * 5; } //單參數,顯式類型=>語句塊
6、() => Console.WriteLine() //無參數
在編寫Lambda表達式時,可以忽略參數的類型,因為編譯器能夠根據上下文直接推斷參數的類型。
Lambda 表達式使用 lambda 聲明運算符 => 從其可執行代碼中分離 lambda 參數清單。 Lambda 表達式,需要在 lambda 運算符左側指定輸入參數(如果有),然後在另一側輸入表達式或語句塊。
方法——>匿名方法——>lambda表達式 更加簡潔
委托和Lambda表達式聯合起來,才能充分的展現委托的便利、才能使代碼更加簡介、優雅。