成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

理解C#中的Lambda表達式

開發 后端
本文向您介紹C#中的Lambda表達式,通過兩種寫法的比較分析Lmdba表達式的委托類型和匿名方法。

先來看兩段C#代碼,來比較Lambda表達式:

  1. Thread t = new Thread(() =>   
  2. {   
  3. AddIt AddDelegate = new AddIt(AddItem);   
  4. this.Invoke(AddDelegate);   
  5. });   
  6.  
  7. Thread t3 = new Thread(new ThreadStart(() =>   
  8. {   
  9. AddIt AddDelegate = new AddIt(AddItem);   
  10. this.Invoke(AddDelegate);   
  11. }));   

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

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

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

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

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

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

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

2. Lamdba 表達式可以用作匿名方法

  1. MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });   
  2. //相當于:  
  3.   MethodInvoker invoker = new MethodInvoker(MyFunc);  
  4.   partial void MyFunc()  
  5.   {  
  6.     Console.WriteLine();  
  7.   }  

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

實際上,當我們這樣去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):

所以這樣寫是可以的:

  1. MethodInvoker invoker = new MethodInvoker(MyFunc);  
  2. //而匿名的委托又可以描述為Lambda表達式  
  3.   MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });  
  4. //另外一方面,由于編譯器對"寬松委托"的支持, MethodInvoker類委托可以轉化成匿名類委托:  
  5.   MethodInvoker invoker = delegate() { Console.WriteLine(); };  
  6. //而匿名的委托又可以用Lambda表達式來描述  
  7.   MethodInvoker invoker = () => { Console.WriteLine(); };  

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

 

【編輯推薦】

  1. Lambda表達式入門實例
  2. 在C++中使用Lambda函數提高代碼性能
  3. 淺談如何使用Lambda表達式做抽象代表
  4. LINQ中的Lambda表達式
  5. LINQ中的Lambda表達式2
責任編輯:佚名 來源: cnBlog
相關推薦

2024-03-25 13:46:12

C#Lambda編程

2009-08-27 09:44:59

C# Lambda表達

2009-08-27 09:57:50

C# Lambda表達

2009-08-26 16:17:23

C# Lambda表達

2010-10-19 10:03:02

Lambda表達式

2021-08-31 07:19:41

Lambda表達式C#

2009-09-14 13:57:20

C# Lambda表達Lambda表達式

2022-11-07 07:11:19

C#lambda函數

2011-05-20 17:50:45

C#

2010-09-14 14:05:42

C#委托

2022-09-19 14:12:27

C++Lambda表達式

2009-07-01 09:56:10

C#3.0

2022-01-14 07:56:39

C#動態查詢

2023-03-23 18:40:18

Lambda編程C++

2020-10-16 06:40:25

C++匿名函數

2011-07-06 11:04:42

C#正則表達式

2011-04-25 08:44:34

C#正則表達式

2009-08-07 15:41:39

C#正規表達式

2012-06-26 10:03:58

JavaJava 8lambda

2023-11-02 08:25:58

C++Lambda
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 先锋资源网 | 日韩精品中文字幕一区二区三区 | av入口 | 亚洲精品一区中文字幕 | 天天天天操 | 精品国产18久久久久久二百 | 综合国产 | 亚洲在线免费观看 | 欧美中文字幕一区二区三区亚洲 | 国产精品毛片一区二区三区 | 亚洲综合大片69999 | 欧洲视频一区二区 | 久久久久久久久综合 | 成人欧美一区二区三区黑人孕妇 | 亚洲视频一区在线观看 | 黄色激情毛片 | 久久久久久久久久影视 | 在线一区二区三区 | 成人在线中文 | 久久高潮 | 成人日韩精品 | 免费激情网站 | 麻豆视频在线免费看 | 亚洲国产精品一区在线观看 | 免费av在线 | 欧美日韩一卡二卡 | 在线观看精品视频网站 | 三级成人片| 日韩视频在线免费观看 | 黄a网| 成人免费视频网址 | 日屁网站| 国产精品爱久久久久久久 | 日韩欧美中文字幕在线观看 | 久久中文字幕视频 | 久久精彩视频 | 国产999精品久久久久久 | 国产精久久久久久久 | av第一页| 最新日韩精品 | 奇米影视77 |