程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#特征之匿名辦法和Lambda表達式

C#特征之匿名辦法和Lambda表達式

編輯:C#入門知識

C#特征之匿名辦法和Lambda表達式。本站提示廣大學習愛好者:(C#特征之匿名辦法和Lambda表達式)文章只能為提供參考,不一定能成為您想要的結果。以下是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(); };

沒勁的代碼沒了。想曉得這類寫法的幕後黑手麼?
其實編譯器照樣在我們的前面干了一件骯髒的工作:它為我們發生了一個新的辦法,它只是外面上為我們節儉了代碼。


privatevoid<Test>b__0(object sender, EventArgs e)
{
    this.BindData();
}

看看這個編譯器發生的辦法的稱號:

<Test>b_0,Test是這個匿名辦法所放置的處所(由於這個按鈕的時光我是放在一個Test辦法裡的)
還有一點須要留意的是,假如這個匿名辦法是在實例辦法裡應用,那末編譯器為我們生成的幕前方法也是實例辦法,不然就是靜態辦法了.
是否是認為匿名辦法這器械很不錯,削減了許多代碼阿,然則匿名辦法的應用還其實不人道化,甚麼是人道化呢?好比你可以用天然的說話將法式代碼讀出來,如許才算人道化了.在.net 2.0中System.Collections.Generic定名空間下List<T>裡有一些新增的辦法。好比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+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也能簡略的將辦法作為參數傳遞了,還可以層層嵌套,都是很簡略的工作了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved