亂侃一通之:lamada表達式

可以不信,但不可全信^_^

 

lamada表達式,從本質上講,無非是C#一些特性的組合,再加一點編譯器的小魔法:


[1]擴展方法
這次讓我看到了擴展方法不一樣的地方,
讓我沒有想到的是,他不但作用在對象上,更重要的是能夠在接口上也進行擴展
A:在這裏,擴展方法是實施在IEnumerable接口上的(實際上還沒有具體的類型存在)
B:擴展方法把調用的對象從參數中提取出來的,這個好象比A更重要,A還有可以通過別的途來實現
否則我們將寫成:Enumerable.Select(i_s, s => s + 1);
實現前:IEnumerable ie = Enumerable.Select(i_s, s => s + 1);
實現後:IEnumerable ie = i_s.Select(s => s + 1);

 

[2]類型推導
廢話不多說了,沒有類型推導,我們將寫成如下的樣子
實現前:IEnumerable ie = i_s.Select <int,int>(s => s + 1);
實現後:IEnumerable ie = i_s.Select(s => s + 1);
類型推導還有一個副產品,就是VAR.

 

[3]閉包
這個纔是關鍵中的關鍵,不想多說了,具體見我的另一個貼子:
http://topic.csdn.net/u/20090821/13/7c30e8cb-3d37-4d4f-9c11-0df1dd7be8f4.html
因爲java沒能實現閉包,而C#在2.0時實現的,所以說java永遠實施不了LINQ
簡單點說,如果沒有閉包,將不會有lamada表達式的傳遞性寫法.

 

[4]匿名方法
需要使用委託delegate,並傳入方法
實現前:ie = i_s.Select(new Func <int,int>(delegate(int i){return i+1;}));
實現後:IEnumerable ie = i_s.Select(s => s + 1);

 

[5]泛型
這個就不多說了

 

[6]編譯器魔法
A:編譯器自動生成的_SelectIterator_d__d <TSource, TResult>對象
B:C#3.0中的簡寫:s=>s+1,得益於類型識別,省了(),return {},看上去清爽多了

 

[7]其它
其它應該沒有了吧,
有的話請你補充.

總結一下:
[1]一定是基於集合類型的操作,實現了:IEnumerable
[2]表達式被編譯器轉換成委託和靜態擴展方法。
[3]執行擴展方法的返回一個實現了IEnumerable <T> 接口的"編譯器自動生成類型"對象。
[4]這個"對象"傳遞了"數據源",以及委託方法的引用。
[5]一切盡在代碼中....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章