C#特性-匿名方法和Lambda表示式
在我們程式中,經常有這樣一些需求:
1. 需要一個臨時方法,這個方法只會使用一次,或者使用的很少。
2. 這個方法的方法體很短,以至於比方法宣告都短,寫起來實在沒勁(我將其稱之為“一句話方法”)。
沒辦法,這樣的方法寫起來真是吃力不討好,比如一些按鈕事件處理中,有些按鈕點選就是彈出一個對話方塊,或者呼叫一下別的什麼方法。比如下面的程式碼:
this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
private void btnRefresh_Click(object sender, EventArgs e)
{
BindData();
}
這個”Refresh”按鈕就是做一下呼叫一下BindData()資料繫結的方法,為此我們不得不寫一個新方法。好了,C# 2.0為我們提供了匿名方法:
this.btnRefresh.Click += delegate(object sender, EventArgs e) { BindData(); };
沒勁的程式碼沒了。想知道這種寫法的幕後黑手麼?
其實編譯器還是在我們的後面幹了一件齷齪的事情:它為我們產生了一個新的方法,它只是表面上為我們節省了程式碼。
privatevoidb__0(object sender, EventArgs e)
{
this.BindData();
}
看看這個編譯器產生的方法的名稱:
b_0,Test是這個匿名方法所放置的地方(因為這個按鈕的時間我是放在一個Test方法裡的) 還有一點需要注意的是,如果這個匿名方法是在例項方法裡使用,那麼編譯器為我們生成的幕後方法也是例項方法,否則就是靜態方法了。
是不是覺得匿名方法這東西很不錯,減少了很多程式碼阿,但是匿名方法的使用還並不人性化,什麼是人性化呢?比如你可以用自然的語言將程式程式碼讀出來,這樣才算人性化了.在.net 2.0中System.Collections.Generic名稱空間下List裡有一些新增的方法。比如Find,如果使用匿名方法我們如何呼叫呢:
books.Find(delegate(Book book){return book.Price < 50;});
程式碼是很簡單,但是卻無法朗讀出來,來看看Lambda表示式的寫法:
books.Find(book=>book.Price<50);這個Lambda表示式就可以這樣閱讀出來了:給你一本書,如果它的價格小於50則返回true。
好了,那我們就走進Lambda表示式吧:
將使用了Lambda表示式的程式集反編譯後,我們發現,它實際上和匿名方法沒有什麼不同。Lambda的輸入引數就對應著delegate括號裡面的引數,由於Lambda表示式可以推斷引數的型別,所以這裡的引數無需宣告。
Lambda操作符讀作”Goes to”,它後面緊跟著表示式或者是語句塊(這點和匿名方法也不同,匿名方法只能使用語句塊而不能使用表示式),下面我就用例項來說明一下有那些型別的Lambda表示式:
//x的型別省略了,編譯器可以根據上下文推斷出來,後面跟著的是表示式
//x的型別省略了,編譯器可以根據上下文推斷出來,後面跟著的是表示式
x => x+1
deleage(int x){return x+1;}
//後面跟著的是語句塊
x=>{return x+1;}
delegate(int x){return x+1;}
//輸入引數也可以帶型別,帶型別後別忘記小括號哦
(int x) => x+1
delegate(int x){return x+1;}
//也可以多個輸入引數,逗號分隔,別忘記小括號
(x,y) => x+y
delegate(int x,int y){return x+y;}
//無參的也行
() => 1
delegate(){return 1;}
對於Lambda表示式來說她的用法就是如此,但是在Lambda背後卻有很多的故事和玄機。用Lambda表示式可以構建表示式樹,而表示式樹對於Linq來說就像樹根對於樹一樣重要。在這裡就不討論表示式樹的問題了,這個東西也不是三言兩語能夠說清楚的,等待時機成熟的時候我們再來進一步討論。
Lambda表示式更多閱讀
Lambda實際上源遠流長,我們現在使用的機器都是馮-諾依曼體系的,屬於圖靈機,在那之前還有一種稱作λ演算的理論,但是圖靈機由於先被實現出來,所以大行其道,λ演算後來成就了函數語言程式設計語言特別是Lisp,在函數語言程式設計語言裡函式是第一等元素,函式的引數,函式的返回值都是函式,程式沒有變數,函式巢狀函式。而且函數語言程式設計語言一直存在於象牙塔中,所以在工業界並沒有得到通用,不過近年來工業界比較喜歡“復古”風格,所以函數語言程式設計語言也慢慢的走上了歷史的舞臺。函數語言程式設計能解決一些指令式程式設計難以解決的問題(或者解決起來非常麻煩)。C#要做到函式風格程式設計怎麼辦?靠原來的方法定義的方式肯定是不可行的,2.0的匿名方法從某種程式上來說解決了這個問題,但還是不夠,3.0裡的Lambda終於很好的解決了,一個Lambda就是一個delegate,一個delegate指向一個方法,現在我們使用Lambda也能簡單的將方法作為引數傳遞了,還可以層層巢狀,都是很簡單的事情了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-551820/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#中的委託,匿名方法和Lambda表示式C#
- C# Lambda表示式和linq表示式 之 匿名物件查詢接收C#物件
- 初識Lambda表示式(匿名函式)函式
- C#中的Lambda表示式和表示式樹C#
- Java 8 流特性和 Lambda 表示式Java
- java8的新特性之lambda表示式和方法引用Java
- Python函式與lambda 表示式(匿名函式)Python函式
- 五分鐘重溫C#委託,匿名方法,Lambda,泛型委託,表示式樹C#泛型
- C#10新特性-lambda 表示式和方法組的改進C#
- C# Lambda表示式詳解,及Lambda表示式樹的建立C#
- java8特性-lambda表示式Java
- C# 委託,事件和Lambda表示式 (轉)C#事件
- JDK1.8新特性--Lambda表示式JDK
- Java 8新特性(一):Lambda表示式Java
- jdk1.8新特性:Lambda表示式JDK
- .NET3.5新特性,Lambda表示式
- JDK 1.8 新特性之Lambda表示式JDK
- JDK8+的lambda(λ)表示式特性JDK
- C#新特性:匿名類和擴充套件方法C#套件
- C# Lambda表示式的前世今生C#
- 【碼上開學】Kotlin 的高階函式、匿名函式和 Lambda 表示式Kotlin函式
- ?Java8新特性之Lambda表示式,函式式介面,方法引用和default關鍵字Java函式
- JDK1.8新特性之Lambda表示式JDK
- Java8新特性(1):Lambda表示式Java
- JDK1.8新特性之Lambda表示式()->JDK
- Java8新特性(一)-Lambda表示式Java
- java8 新特性之Lambda 表示式Java
- JDK新特性-Lambda表示式的神操作JDK
- java-反射,介面新特性,Lambda表示式Java反射
- Java8 新特性之 Lambda 表示式Java
- jdk1.8 新特性之 lambda表示式JDK
- C++11新特性之Lambda表示式C++
- .net framework3.5新特性:Lambda表示式Framework
- 五分鐘重溫委託,匿名方法,Lambda,泛型委託,表示式樹泛型
- C# 委託(delegate)、泛型委託和Lambda表示式C#泛型
- JDK1.8的新特性之Lambda表示式JDK
- java8新特性之lambda表示式(一)Java
- JDK1.8最新特性--Lambda表示式(重點)JDK