最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#特性之匿名方法和Lambda表達式

 更新時間:2014年12月25日 14:33:41   投稿:mdxy-dxy  
這篇文章主要介紹了C#特性之匿名方法和Lambda表達式,需要的朋友可以參考下

在我們程序中,經(jīng)常有這樣一些需求:

1.       需要一個臨時方法,這個方法只會使用一次,或者使用的很少。
2.       這個方法的方法體很短,以至于比方法聲明都短,寫起來實在沒勁(我將其稱之為“一句話方法”)。

沒辦法,這樣的方法寫起來真是吃力不討好,比如一些按鈕事件處理中,有些按鈕點擊就是彈出一個對話框,或者調(diào)用一下別的什么方法。比如下面的代碼:

復(fù)制代碼 代碼如下:

this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
private void btnRefresh_Click(object sender, EventArgs e)
{
    BindData();
}

這個”Refresh”按鈕就是做一下調(diào)用一下BindData()數(shù)據(jù)綁定的方法,為此我們不得不寫一個新方法。好了,C# 2.0為我們提供了匿名方法:

this.btnRefresh.Click += delegate(object sender, EventArgs e) { BindData(); };

沒勁的代碼沒了。想知道這種寫法的幕后黑手么?
其實編譯器還是在我們的后面干了一件齷齪的事情:它為我們產(chǎn)生了一個新的方法,它只是表面上為我們節(jié)省了代碼。

復(fù)制代碼 代碼如下:

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

看看這個編譯器產(chǎn)生的方法的名稱:

<Test>b_0,Test是這個匿名方法所放置的地方(因為這個按鈕的時間我是放在一個Test方法里的)
還有一點需要注意的是,如果這個匿名方法是在實例方法里使用,那么編譯器為我們生成的幕后方法也是實例方法,否則就是靜態(tài)方法了.
是不是覺得匿名方法這東西很不錯,減少了很多代碼阿,但是匿名方法的使用還并不人性化,什么是人性化呢?比如你可以用自然的語言將程序代碼讀出來,這樣才算人性化了.在.net 2.0中System.Collections.Generic命名空間下List<T>里有一些新增的方法。比如Find,如果使用匿名方法我們?nèi)绾握{(diào)用呢:

復(fù)制代碼 代碼如下:

books.Find(delegate(Book book){return book.Price < 50;});

代碼是很簡單,但是卻無法朗讀出來,來看看Lambda表達式的寫法:
books.Find(book=>book.Price<50);這個Lambda表達式就可以這樣閱讀出來了:給你一本書,如果它的價格小于50則返回true。
好了,那我們就走進Lambda表達式吧:

將使用了Lambda表達式的程序集反編譯后,我們發(fā)現(xiàn),它實際上和匿名方法沒有什么不同。Lambda的輸入?yún)?shù)就對應(yīng)著delegate括號里面的參數(shù),由于Lambda表達式可以推斷參數(shù)的類型,所以這里的參數(shù)無需聲明。Lambda操作符讀作”Goes to”,它后面緊跟著表達式或者是語句塊(這點和匿名方法也不同,匿名方法只能使用語句塊而不能使用表達式),下面我就用實例來說明一下有那些類型的Lambda表達式:

//x的類型省略了,編譯器可以根據(jù)上下文推斷出來,后面跟著的是表達式
x => x+1
deleage(int x){return x+1;}
//后面跟著的是語句塊
x=>{return x+1;}
delegate(int x){return x+1;}
//輸入?yún)?shù)也可以帶類型,帶類型后別忘記小括號哦
(int x) => x+1
delegate(int x){return x+1;}
//也可以多個輸入?yún)?shù),逗號分隔,別忘記小括號
(x,y) => x+y
delegate(int x,int y){return x+y;}
//無參的也行

() => 1

delegate(){return 1;}

對于Lambda表達式來說她的用法就是如此,但是在Lambda背后卻有很多的故事和玄機。用Lambda表達式可以構(gòu)建表達式樹,而表達式樹對于Linq來說就像樹根對于樹一樣重要。在這里就不討論表達式樹的問題了,這個東西也不是三言兩語能夠說清楚的,等待時機成熟的時候我們再來進一步討論。

Lambda表達式更多閱讀

Lambda實際上源遠流長,我們現(xiàn)在使用的機器都是馮-諾依曼體系的,屬于圖靈機,在那之前還有一種稱作λ演算的理論,但是圖靈機由于先被實現(xiàn)出來,所以大行其道,λ演算后來成就了函數(shù)式編程語言特別是Lisp,在函數(shù)式編程語言里函數(shù)是第一等元素,函數(shù)的參數(shù),函數(shù)的返回值都是函數(shù),程序沒有變量,函數(shù)嵌套函數(shù)。而且函數(shù)式編程語言一直存在于象牙塔中,所以在工業(yè)界并沒有得到通用,不過近年來工業(yè)界比較喜歡“復(fù)古”風(fēng)格,所以函數(shù)式編程語言也慢慢的走上了歷史的舞臺。函數(shù)式編程能解決一些命令式編程難以解決的問題(或者解決起來非常麻煩)。C#要做到函數(shù)風(fēng)格編程怎么辦?靠原來的方法定義的方式肯定是不可行的,2.0的匿名方法從某種程序上來說解決了這個問題,但還是不夠,3.0里的Lambda終于很好的解決了,一個Lambda就是一個delegate,一個delegate指向一個方法,現(xiàn)在我們使用Lambda也能簡單的將方法作為參數(shù)傳遞了,還可以層層嵌套,都是很簡單的事情了。

相關(guān)文章

  • C#實現(xiàn)Excel導(dǎo)入sqlite的方法

    C#實現(xiàn)Excel導(dǎo)入sqlite的方法

    這篇文章主要介紹了C#實現(xiàn)Excel導(dǎo)入sqlite的方法,是C#程序設(shè)計中非常重要的一個實用技巧,需要的朋友可以參考下
    2014-09-09
  • C#調(diào)用WebService的實現(xiàn)方法

    C#調(diào)用WebService的實現(xiàn)方法

    這篇文章主要介紹了C#調(diào)用WebService的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • C# WinForm實現(xiàn)圖片瀏覽器

    C# WinForm實現(xiàn)圖片瀏覽器

    這篇文章主要為大家詳細介紹了C# WinForm實現(xiàn)圖片瀏覽器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C# .NET實現(xiàn)為PDF文檔添加水印

    C# .NET實現(xiàn)為PDF文檔添加水印

    本文將為 C# 開發(fā)者提供一個詳細的指南,介紹如何在 .NET 環(huán)境下通過 C# 為 PDF 文檔添加各種類型的水印,包括文本水印、圖片水印等,需要的小伙伴可以了解下
    2025-12-12
  • C#程序調(diào)用cmd.exe執(zhí)行命令

    C#程序調(diào)用cmd.exe執(zhí)行命令

    這篇文章介紹了C#程序調(diào)用cmd.exe執(zhí)行命令的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C# Linq延遲查詢的執(zhí)行實例代碼

    C# Linq延遲查詢的執(zhí)行實例代碼

    這篇文章主要介紹了C# Linq延遲查詢執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C#修改及重置電腦密碼DirectoryEntry實現(xiàn)方法

    C#修改及重置電腦密碼DirectoryEntry實現(xiàn)方法

    這篇文章主要介紹了C#修改及重置電腦密碼DirectoryEntry實現(xiàn)方法,實例分析了C#修改及重置電腦密碼的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#中Random.Next方法的使用小結(jié)

    C#中Random.Next方法的使用小結(jié)

    在C#中,Random.Next()方法用于生成一個隨機整數(shù),本文主要介紹了C#中Random.Next方法的使用小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • C#實現(xiàn)基于XML配置MenuStrip菜單的方法

    C#實現(xiàn)基于XML配置MenuStrip菜單的方法

    這篇文章主要介紹了C#實現(xiàn)基于XML配置MenuStrip菜單的方法,涉及C#使用XML配置MenuStrip菜單的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • c# 獲取機器唯一識別碼的示例

    c# 獲取機器唯一識別碼的示例

    這篇文章主要介紹了c# 獲取機器唯一識別碼的示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03

最新評論

齐河县| 科尔| 安溪县| 罗江县| 衡山县| 嘉荫县| 丽江市| 平湖市| 合水县| 温宿县| 海城市| 新宁县| 山东省| 宁蒗| 彰武县| 高邑县| 珲春市| 琼海市| 崇信县| 清徐县| 河北省| 锡林郭勒盟| 乐昌市| 安仁县| 杂多县| 横山县| 永新县| 保定市| 防城港市| 漳州市| 宁国市| 大港区| 鞍山市| 西和县| 松桃| 临高县| 东丽区| 湟中县| 东乌| 平江县| 鄂托克前旗|