在C#2.0引入匿名方法以前,聲明委託的惟一方法就是使用命名方法,C#2.0以後的C#3.0中開始引入了Lambda表達式取代了匿名方法。spa
匿名方法code
要說Lambda必然離不開匿名方法,實際上,Lambda的本質就是一個匿名方法,上代碼對象
class Program { delegate void SayHello(string name); public static void Main(string[] args) { SayHello sh1 = HelloMethod; SayHello sh2 = delegate (string name)//匿名方法 { Console.WriteLine("Hello:" + name); }; sh1("jiming1"); sh2("jiming2"); Console.Read(); } public static void HelloMethod(string name) { Console.WriteLine("Hello:" + name); } }
上述代碼中,首先定義了一個委託SayHello,註冊到改委託的方法須要有一個string類型的參數,第一個委託對象sh1直接使用的是命名方法HelloMethod,第二個委託對象sh2使用的就是匿名方法.blog
Lambda表達式string
lambda運算符:全部的lambda表達式都是用新的lambda運算符 " => ",能夠叫他,「轉到」或者 「成爲」。運算符將表達式分爲兩部分,左邊指定輸入參數,右邊是lambda的主體。參數的個數能夠是0、1或多個,只有當輸入參數是1個時,Lambda表達式左邊的小闊海才能夠省略it
示例:io
public static void Main(string[] args) { Action action = new Action(() => Console.WriteLine("0參數Lambda")); action.Invoke(); Console.Read(); }
分析:上述代碼中,他輸入的參數是0,方法主體打印"0參數Lambda"class
示例2:變量
public static void Main(string[] args) { Func<int,int> func = new Func<int,int>(m=>m*2); Console.WriteLine(func.Invoke(3)); Console.Read(); }
上述Lambda表達式的輸入參數省略了一對小括弧,它與「(m)=>m*2」Lambda表達式是等效的。這裏還包含另一個C#的語法糖,因爲方法體中只有一句話,因此,能夠省略{},甚至省略了return,實際上,上述代碼的所有寫法應該是:lambda
public static void Main(string[] args) { Func<int, int> func = new Func<int, int>((m) =>{ return m * 2; }); Console.WriteLine(func.Invoke(3)); Console.Read(); }
示例3:
public static void Main(string[] args) { Action<int, int> action = new Action<int, int>((m,n)=> { int result = m * n; Console.WriteLine(result); }); action.Invoke(3, 2); Console.Read(); }
上述代碼中左邊是兩個參數,m\n,方法體中是計算m*n的結果,而後打印出來,因爲方法體中是多行,所以,不能省略{}
總結:
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所在方法提所定義的局部變量,這樣可以較少參數的定義和傳遞。
public static void Main(string[] args) { string name = "jiming"; Func<int, int,int> func = new Func<int, int,int>((m,n)=> { int result = m * n; Console.WriteLine(result); Console.WriteLine(name); return result; }); func.Invoke(3, 3); Console.Read(); }
如上述代碼,name變量是定義在Main方法中的,若是不使用Lambda,使用命名方法的話,在命名方法中使用name我須要定義一個變量以後傳遞進入,而使用Lambda後很方便的就可以訪問name變量了