.net進行3.5時代后,各種新的語言特性相繼而來,今天主要說的是Lambda表達式帶給我們的是什么?
說lambda肯定離不開匿名方法,說匿名方法肯定離不開委托,其實,你可以把這三個東西看作是一個事物的不同發展階段,他們也標志着.net framework的發展史:
.net frameworks 1.x 委托
.net frameworks 2.x 匿名方法來實現委托
.net frameworks 3.x lambda表達式來實現委托
委托,delegate你不要簡單的說,“把方法當方法的參數傳遞給一個方法”,說實話,過去很長一段時間我也是局限在這個概念上的,但真的靜下來想想,可能並非這樣,委托做為一種思想出現在了.net世界里,從1.x就開始了它的征途,到2.x委托的實例創建上有了質的突破,可能體現在寫法簡潔上(匿名方法),到了3.x配合lambda表達式,使人們漸漸把委托給忘記了,其實在lambda表達式里,你關心的可能不在是委托,而是一個業務的語義問題,即它更加人性化了。如select選擇,where條件,orderby排序等。
下面再帶大家看一個1.x到3.x委托實例的演化
.net 1.x時代
1 /// <summary> 2 /// 輸出字符串,返回為整數 3 /// </summary> 4 /// <param name="str"></param> 5 /// <returns></returns> 6 public delegate int Count(string str); 7 /// <summary> 8 /// 求字符長度的方法 9 /// </summary> 10 /// <param name="str"></param> 11 /// <returns></returns> 12 public static int StrLength(string str) { return str.Length; }
調用時,需要實例化委托
1 Count a = new Count(StrLength); 2 a("abc");
.net 2.x時代,出現了匿名方法,它省略了實名方法的創建
1 Count anonymous = delegate(string str2) 2 { 3 return str2.Length; 4 }; 5 Console.WriteLine(anonymous("123"));
使用匿名方法,確實優化了不少,但好像還是少了點什么,感覺有點別扭,可以是delegate關鍵惹的禍吧
,在進入.net3.5 時代后,引入了lambda表達式,看看這種很炫的技術吧
1 Count lambda = i => 2 { 3 return i.Length; 4 };
代碼又精簡了,去掉了delegate關鍵字,實現上這種寫法還不是正規的表達式寫法,代碼可以代進行精減
1 Count lambda2 = i => i.Length;
恩,這回應該是我們所需要的了,事實上,lambda表達式的這種特性叫“類型推演”,它可以推斷出你的類型是什么,這個特性被廣泛的應用在了LINQ上。
而向我之前介紹過的Func也是微軟為我們封裝好的委托,用lambda來實現它,很巧妙
Func<int, int> chengfang = (int cheng) => cheng * cheng;
當然,在lambda表達式美麗的背后,也有一些缺點:如性能有所降低,當然我是我們可以接受的
