国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

理解C#中的Lambda表達式

2020-01-24 02:00:27
字體:
來源:轉載
供稿:網友

先來看兩段代碼:

復制代碼 代碼如下:

 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();
  }
 

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

復制代碼 代碼如下:

  MethodInvoker invoker = new MethodInvoker(MyFunc);
 

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

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

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

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

復制代碼 代碼如下:

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

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

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

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

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和平区| 名山县| 昌江| 莱西市| 惠东县| 彰化县| 贵港市| 思南县| 左云县| 河池市| 富蕴县| 罗城| 化州市| 察雅县| 栾城县| 榆中县| 赤壁市| 富裕县| 乌拉特后旗| 基隆市| 澜沧| 宝山区| 金乡县| 神木县| 南皮县| 吕梁市| 永福县| 永安市| 苍梧县| 临沭县| 英超| 永嘉县| 县级市| 巴彦县| 临湘市| 定西市| 桓台县| 砀山县| 申扎县| 顺义区| 徐州市|