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

理解C#中的Lambda表達式

 更新時間:2015年04月10日 10:53:50   投稿:junjie  
這篇文章主要介紹了理解C#中的Lambda表達式,本文用實例代碼來講解Lambda表達式,用不同的角度總結(jié)對它的認識,需要的朋友可以參考下

先來看兩段代碼:

復制代碼 代碼如下:

 Thread t = new Thread(() =>
{
AddIt AddDelegate = new AddIt(AddItem);
this.Invoke(AddDelegate);
});

Thread t3 = new Thread(new ThreadStart(() =>
{
AddIt AddDelegate = new AddIt(AddItem);
this.Invoke(AddDelegate);
}));


 
這兩種寫法都是可以的,出來的IL也一樣,但是意義是不同的,后者相當于匿名方法,前者

更像是"匿名"的委托,其實這樣寫:

復制代碼 代碼如下:

Thread t2 = new Thread(() =>
{
this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); }));
});

這個跟上面兩種寫法也是一樣的效果,初次接觸的時候,可能大家跟我一樣會有些迷茫,Lamdba表達式到底該怎么用呢?

首先還是要弄清Lamdba表達式的幾個特性:

1. Lamdba 表達式是一個委托類型:

復制代碼 代碼如下:

  MethodInvoker invoker = () => { Console.WriteLine(); };
//is actually equal to the following form.
  MethodInvoker invoker = delegate() { Console.WriteLine(); };
//這里是Lamdba 表達式的匿名委托的用法

2. Lamdba 表達式可以用作匿名方法
復制代碼 代碼如下:

  MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//相當于:
  MethodInvoker invoker = new MethodInvoker(MyFunc);
  partial void MyFunc()
  {
    Console.WriteLine();
  }
 

我們知道, 當構(gòu)造一個新的委托的時候, 他的構(gòu)造器需要一個函數(shù)指針作參數(shù),這個函數(shù)指針是委托類型的
實際上,當我們這樣去new 一個委托的時候:

復制代碼 代碼如下:

  MethodInvoker invoker = new MethodInvoker(MyFunc);
 

"MyFunc" 就是一個委托,而不只是一個函數(shù)名的存在. 編譯器將為這個構(gòu)造函數(shù)生成一個匿名委托:
復制代碼 代碼如下:

  MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
 

可以這樣理解編譯器的行為: 匿名方法其實也就是委托。

那么為什么我們可以這么寫呢:

復制代碼 代碼如下:

  MethodInvoker invoker = () => { Console.WriteLine(); };
 

我們來看一看:
首先,這個委托的構(gòu)造器需要一個委托參數(shù),所以通常我們得這樣寫:
復制代碼 代碼如下:

  MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });

但是匿名的delegate 可以轉(zhuǎn)化成函數(shù)指針 (void() target):
 所以這樣寫是可以的:
復制代碼 代碼如下:

 MethodInvoker invoker = new MethodInvoker(MyFunc);
//而匿名的委托又可以描述為Lambda表達式
  MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });

//另外一方面,由于編譯器對"寬松委托"的支持, MethodInvoker類委托可以轉(zhuǎn)化成匿名類委托:
復制代碼 代碼如下:

  MethodInvoker invoker = delegate() { Console.WriteLine(); };
//而匿名的委托又可以用Lambda表達式來描述
  MethodInvoker invoker = () => { Console.WriteLine(); };

從上面,我們可以看到一個復雜的委托是如何轉(zhuǎn)化成簡潔的Lambda表達式的。這對程序員來說無疑又是提高生產(chǎn)力的一個體現(xiàn)!

相關(guān)文章

  • c# Parallel類的使用

    c# Parallel類的使用

    這篇文章主要介紹了c# Parallel類的使用,幫助大家實現(xiàn)數(shù)據(jù)與任務的并行,感興趣的朋友可以了解下
    2020-11-11
  • C#中的委托和事件詳解

    C#中的委托和事件詳解

    本文詳細講解了C#中的委托和事件,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • c# 以二進制讀取文本文件

    c# 以二進制讀取文本文件

    在當前目錄創(chuàng)建一個文件myfile.txt,對該文件具有讀寫權(quán)限
    2009-07-07
  • Unity Blend Tree動畫混合樹使用入門教程

    Unity Blend Tree動畫混合樹使用入門教程

    這篇文章主要為大家詳細介紹了Unity Blend Tree動畫混合樹使用入門教程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • asp.net中調(diào)用oracle存儲過程的方法

    asp.net中調(diào)用oracle存儲過程的方法

    存儲過程是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL 語句集,存儲在數(shù)據(jù)庫中經(jīng)過第一次編譯后再次調(diào)用不需要再次編譯,用戶通過指定存儲過程的名字并給出參數(shù)來執(zhí)行它,下面給大家介紹下asp.net中調(diào)用oracle存儲過程的方法,需要的朋友可以參考下
    2015-08-08
  • C#讀寫INI文件的方法

    C#讀寫INI文件的方法

    這篇文章主要介紹了C#讀寫INI文件的方法,涉及C#讀寫ini文件的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • C#實現(xiàn)三元組的使用示例

    C#實現(xiàn)三元組的使用示例

    本文介紹了C#中的三元組數(shù)據(jù)結(jié)構(gòu),以及如何使用三元組在C#中進行一些特定的計算,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • c#進程之間對象傳遞方法

    c#進程之間對象傳遞方法

    本文主要介紹了c#進程之間對象傳遞的方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • C# 語音功能的實現(xiàn)方法

    C# 語音功能的實現(xiàn)方法

    最近看了一些資料,是c#實現(xiàn)語音功能的?,F(xiàn)在就簡單的講一下怎么實現(xiàn)。
    2013-03-03
  • newtonsoft.json解析天氣數(shù)據(jù)出錯解決方法

    newtonsoft.json解析天氣數(shù)據(jù)出錯解決方法

    這篇文章主要介紹了NewtonSoft.JSon解析天氣數(shù)據(jù)時出錯的解決方法,需要的朋友可以參考下
    2014-02-02

最新評論

波密县| 湖州市| 孝昌县| 东兴市| 大竹县| 甘泉县| 巢湖市| 汕尾市| 札达县| 江达县| 定兴县| 忻州市| 新巴尔虎右旗| 伊吾县| 内丘县| 巍山| 固镇县| 晋中市| 梧州市| 固阳县| 梁河县| 合山市| 资溪县| 团风县| 彭阳县| 常宁市| 乌拉特后旗| 泉州市| 瑞丽市| 太康县| 克拉玛依市| 眉山市| 格尔木市| 若尔盖县| 绥棱县| 福州市| 双峰县| 黑龙江省| 元阳县| 霍山县| 烟台市|