日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
理解C#中的Lambda表達式

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

在白沙黎族等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供做網(wǎng)站、成都做網(wǎng)站 網(wǎng)站設(shè)計制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,全網(wǎng)整合營銷推廣,外貿(mào)網(wǎng)站制作,白沙黎族網(wǎng)站建設(shè)費用合理。

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

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

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

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

這個跟上面兩種寫法也是一樣的效果,初次接觸的時候,可能大家跟我一樣會有些迷茫,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.   }

我們知道, 當構(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):

所以這樣寫是可以的:

 
 
 
  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)!


新聞名稱:理解C#中的Lambda表達式
文章地址:http://m.5511xx.com/article/djodcjj.html