委託:html
delegate是C#中的一種類型,它其實是一個可以持有對某個方法的引用的類。與其它的類不一樣,delegate類可以擁有一個簽名(signature),而且它只能持有與它的簽名相匹配的方法的引用。它所實現的功能與C/C++中的函數指針十分類似。它容許你傳遞一個類A的方法m給另外一個類B的對象,使得類B的對象可以調用這個方法m。但與函數指針相比,delegate有許多函數指針不具有的優勢。首先,函數指針只能指向靜態函數,而delegate既能夠引用靜態函數,又能夠引用非靜態成員函數。在引用非靜態成員函數時,delegate不但保存了對此函數入口指針的引用,並且還保存了調用此函數的類實例的引用。其次,與函數指針相比,delegate是面向對象、類型安全、可靠的受控(managed)對象。也就是說,runtime可以保證delegate指向一個有效的方法,你無須擔憂delegate會指向無效地址或者越界地址編程
委託傳送文 :http://www.javashuo.com/article/p-ubzkzfab-e.html安全
匿名方法:編程語言
匿名方法(Anonymous methods) 提供了一種傳遞代碼塊做爲委託參數的技術。匿名方法是沒有名稱只有主體的方法。函數式編程
在匿名方法中您不須要指定返回類型,它是從方法主體內的 return 語句推斷的。函數
匿名方法傳送文 :http://www.runoob.com/csharp/csharp-anonymous-methods.htmlspa
Lambda:.net
這裏介紹C# Lambda表達式,它實際上和匿名方法沒有什麼不一樣。Lambda的輸入參數就對應着delegate括號裏面的參數,因爲C# Lambda表達式能夠推斷參數的類型,因此這裏的參數無需聲明。
C#語言仍是比較常見的東西,這裏咱們主要介紹C# Lambda表達式,包括介紹一個Lambda就是一個delegate,一個delegate指向一個方法等方面。
你有沒有接觸過C# Lambda表達式,有沒有以爲匿名方法這東西很不錯,減小了不少代碼阿,可是匿名方法的使用還並不人性化,什麼是人性化呢?好比你能夠用天然的語言將程序代碼讀出來,這樣纔算人性化了。在.net 2.0中System.Collections.Generic命名空間下List裏有一些新增的方法。好比Find,若是使用匿名方法咱們如何調用呢:
- books.Find(delegate(Book book){return book.Price <50;});
代碼是很簡單,可是卻沒法朗讀出來,來看看C# Lambda表達式的寫法:
books.Find(book=>book.Price<50);這個C# Lambda表達式就能夠這樣閱讀出來了:給你一本書,若是它的價格小於50則返回true。
好了,那咱們就走進C# Lambda表達式吧:指針
將使用了C# Lambda表達式的程序集反編譯後,咱們發現,它實際上和匿名方法沒有什麼不一樣。Lambda的輸入參數就對應着delegate括號裏面的參數,因爲C# Lambda表達式能夠推斷參數的類型,因此這裏的參數無需聲明。
Lambda操做符讀做」Goes to」,它後面緊跟着表達式或者是語句塊(這點和匿名方法也不一樣,匿名方法只能使用語句塊而不能使用表達式),下面我就用實例來講明一下有那些類型的C# Lambda表達式:
//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;}
對於C# Lambda表達式來講她的用法就是如此,可是在Lambda背後卻有不少的故事和玄機。用C# Lambda表達式能夠構建表達式樹,而表達式樹對於Linq來講就像樹根對於樹同樣重要。在這裏就不討論表達式樹的問題了,這個東西也不是三言兩語可以說清楚的,等待時機成熟的時候咱們再來進一步討論。
C# Lambda表達式更多閱讀htm
Lambda實際上源遠流長,咱們如今使用的機器都是馮-諾依曼體系的,屬於圖靈機,在那以前還有一種稱做λ演算的理論,可是圖靈機因爲先被實現出來,因此大行其道,λ 演算後來成就了函數式編程語言特別是Lisp,在函數式編程語言裏函數是第一等元素,函數的參數,函數的返回值都是函數,程序沒有變量,函數嵌套函數。並且函數式編程語言一直存在於象牙塔中,因此在工業界並無獲得通用,不過近年來工業界比較喜歡「復古」風格,因此函數式編程語言也慢慢的走上了歷史的舞臺。函數式編程能解決一些命令式編程難以解決的問題(或者解決起來很是麻煩)。C#要作到函數風格編程怎麼辦?靠原來的方法
定義的方式確定是不可行的,2.0的匿名方法從某種程序上來講解決了這個問題,但仍是不夠,3.0裏的Lambda終於很好的解決了,一個Lambda就是一個delegate,一個delegate指向一個方法,如今咱們使用Lambda也能簡單的將方法做爲參數傳遞了,還能夠層層嵌套,都是很簡單的事情了。
資料轉載:特別鳴謝