新聞中心
先來(lái)看兩段C#代碼,來(lái)比較Lambda表達(dá)式:

在白沙黎族等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供做網(wǎng)站、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)整合營(yíng)銷(xiāo)推廣,外貿(mào)網(wǎng)站制作,白沙黎族網(wǎng)站建設(shè)費(fèi)用合理。
- 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);
- }));
這兩種寫(xiě)法都是可以的,出來(lái)的IL也一樣,但是意義是不同的,后者相當(dāng)于匿名方法,前者
更像是"匿名"的委托,其實(shí)這樣寫(xiě):
- Thread t2 = new Thread(() =>
- {
- this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); }));
- });
這個(gè)跟上面兩種寫(xiě)法也是一樣的效果,初次接觸的時(shí)候,可能大家跟我一樣會(huì)有些迷茫,Lamdba表達(dá)式到底該怎么用呢?
首先還是要弄清Lamdba表達(dá)式的幾個(gè)特性:
1. Lamdba 表達(dá)式是一個(gè)委托類(lèi)型:
- MethodInvoker invoker = () => { Console.WriteLine(); };
- //is actually equal to the following form.
- MethodInvoker invoker = delegate() { Console.WriteLine(); };
- //這里是Lamdba 表達(dá)式的匿名委托的用法
2. Lamdba 表達(dá)式可以用作匿名方法
- MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
- //相當(dāng)于:
- MethodInvoker invoker = new MethodInvoker(MyFunc);
- partial void MyFunc()
- {
- Console.WriteLine();
- }
我們知道, 當(dāng)構(gòu)造一個(gè)新的委托的時(shí)候, 他的構(gòu)造器需要一個(gè)函數(shù)指針作參數(shù),這個(gè)函數(shù)指針是委托類(lèi)型的
實(shí)際上,當(dāng)我們這樣去new 一個(gè)委托的時(shí)候:
MethodInvoker invoker = new MethodInvoker(MyFunc);
"MyFunc" 就是一個(gè)委托,而不只是一個(gè)函數(shù)名的存在. 編譯器將為這個(gè)構(gòu)造函數(shù)生成一個(gè)匿名委托:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
可以這樣理解編譯器的行為: 匿名方法其實(shí)也就是委托。
那么為什么我們可以這么寫(xiě)呢:
MethodInvoker invoker = () => { Console.WriteLine(); };
我們來(lái)看一看:
首先,這個(gè)委托的構(gòu)造器需要一個(gè)委托參數(shù),所以通常我們得這樣寫(xiě):
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
但是匿名的delegate 可以轉(zhuǎn)化成函數(shù)指針 (void() target):
所以這樣寫(xiě)是可以的:
- MethodInvoker invoker = new MethodInvoker(MyFunc);
- //而匿名的委托又可以描述為L(zhǎng)ambda表達(dá)式
- MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
- //另外一方面,由于編譯器對(duì)"寬松委托"的支持, MethodInvoker類(lèi)委托可以轉(zhuǎn)化成匿名類(lèi)委托:
- MethodInvoker invoker = delegate() { Console.WriteLine(); };
- //而匿名的委托又可以用Lambda表達(dá)式來(lái)描述
- MethodInvoker invoker = () => { Console.WriteLine(); };
從上面,我們可以看到一個(gè)復(fù)雜的委托是如何轉(zhuǎn)化成簡(jiǎn)潔的Lambda表達(dá)式的。這對(duì)程序員來(lái)說(shuō)無(wú)疑又是提高生產(chǎn)力的一個(gè)體現(xiàn)!
分享名稱(chēng):理解C#中的Lambda表達(dá)式
瀏覽地址:http://www.dlmjj.cn/article/djodcjj.html


咨詢(xún)
建站咨詢(xún)
