可以不信,但不可全信^_^
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]一切盡在代碼中....