代碼之美~Lambda帶給我們的不只是簡潔


.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<intint> chengfang = (int cheng) => cheng * cheng;

當然,在lambda表達式美麗的背后,也有一些缺點:如性能有所降低,當然我是我們可以接受的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM