天天看點

C# 委托及Lambda 表達式

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表達式聯合起來,才能充分的展現委托的便利、才能使代碼更加簡介、優雅。