成人免费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表達式

2011-05-20 17:50:45

C#

2022-11-07 07:11:19

C#lambda函數

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#正規表達式

2023-11-02 08:25:58

C++Lambda

2012-06-26 10:03:58

JavaJava 8lambda
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级黄色毛片 | 亚洲第一网站 | 久久精品99 | 精品一区二区三区四区视频 | 成人免费观看网站 | 成人性视频免费网站 | 国产精品久久久久久久久久免费看 | 福利片在线观看 | 亚洲免费在线观看 | 99精品免费在线观看 | 国产真实精品久久二三区 | 国产成人亚洲精品自产在线 | 欧美美女一区二区 | 9999在线视频 | 久久久久免费精品国产 | 日本成人中文字幕 | 日韩在线观看一区二区三区 | www.成人.com| 国产精品日韩一区二区 | 国产精品久久 | 成人一区二区三区在线观看 | 日韩综合在线播放 | 一级片网址 | 日韩一级 | 四虎影院在线观看免费视频 | 亚洲在线一区二区 | 亚洲综合一区二区三区 | 国产小视频精品 | 日本一区高清 | 五月天国产在线 | 玖玖玖在线 | 一级黄色毛片 | www四虎com| 天天躁日日躁狠狠的躁天龙影院 | 亚洲a级 | 人人爽日日躁夜夜躁尤物 | 国产一级在线 | 毛片av免费看 | 成人精品久久 | 久久九九免费 | 欧美成人a∨高清免费观看 色999日韩 |