匿名函數一個“內聯”語句或表達式,可在需要委托類型的任何地方使用。可以使用匿名函數來初始化命名委托,或傳遞命名委托(而不是命名委托類型)作為方法參數。
共有兩種匿名函數:
Lambda表達式(在這裡只舉例在Lambda表達式在委托中的應用)
匿名方法
Lambda表達式是一種可用於創建委托或表達式目錄樹(以後再討論)類型的匿名函數。通過使用Lambda表達式,可以寫入可作為參數傳遞或作為函數調用值返回的本地函數。
若要創建Lambda表達式,需要在Lambda運算符 =>左側指定輸入參數(如果有),然後在另一側輸入表達式或語句塊。
看一個例子:
delegate int del(int i); static void Main(string[] args) { //Lambda表達式用於創建委托 del myDelegate = x => x * x; int j = myDelegate(5); Console.WriteLine(j); }
(input parameters)=>expression
僅當Lambda只有一個輸入參數時,括號才是可選的;否則括號是必須的。括號內的兩個或更多輸入參數使用逗號加以分割:
(x, y)=>x==y
有時,編譯器難以或無法推斷輸入類型,如果這種出現這種情況,你可以顯示指定類型:
(int x, string s)=>s.length>x
使用空括號指定領個輸入參數:
( )=>SomeMethod()
語句Lambda
語句Lamdba與表達式Lambda表達式類似,只是語句括在大括號中:
( input parameters ) => { statement ;}
看一個例子:
delegate void TestDelegate(string s); static void Main(string[] args) { //Lambda語句用於創建委托 TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); }; myDel("Hello"); }
匿名方法
在2.0之前的C#版本中,聲明委托的唯一方法是使用命名方法。C# 2.0引入了匿名方法,而在C# 3.0及更高版本中,Lambda表達式取代了匿名方法,作為編寫內聯代碼的首先方式。
看一個例子:
delegate void Printer(string s); static void Main(string[] args) { //委托與匿名方法關聯 Printer p = delegate (string st) { Console.WriteLine(st); }; p("The delegate using the anonymous method is called."); //委托與命名方法關聯 p = new Printer(DoWork); p("The delegate using the named method is called."); Console.ReadKey(); } static void DoWork(string k) { Console.WriteLine(k); }