自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

理解C#中的Lambda表達式

開發(fā) 后端
本文向您介紹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.   }  

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

實際上,當我們這樣去new 一個委托的時候:

MethodInvoker invoker = new MethodInvoker(MyFunc);

"MyFunc" 就是一個委托,而不只是一個函數(shù)名的存在. 編譯器將為這個構造函數(shù)生成一個匿名委托:

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

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

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

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

我們來看一看:

首先,這個委托的構造器需要一個委托參數(shù),所以通常我們得這樣寫:

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

但是匿名的delegate 可以轉(zhuǎn)化成函數(shù)指針 (void() target):

所以這樣寫是可以的:

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

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

 

【編輯推薦】

  1. Lambda表達式入門實例
  2. 在C++中使用Lambda函數(shù)提高代碼性能
  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-26 16:17:23

C# Lambda表達

2009-08-27 09:57:50

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表達式

2010-09-14 14:05:42

C#委托

2011-05-20 17:50:45

C#

2022-11-07 07:11:19

C#lambda函數(shù)

2009-07-01 09:56:10

C#3.0

2022-09-19 14:12:27

C++Lambda表達式

2022-01-14 07:56:39

C#動態(tài)查詢

2023-03-23 18:40:18

Lambda編程C++

2020-10-16 06:40:25

C++匿名函數(shù)

2011-04-25 08:44:34

C#正則表達式

2011-07-06 11:04:42

C#正則表達式

2009-08-07 15:41:39

C#正規(guī)表達式

2012-06-26 10:03:58

JavaJava 8lambda

2009-09-11 09:48:27

Linq Lambda
點贊
收藏

51CTO技術棧公眾號