理解C#中的Lambda表達(dá)式
先來看兩段代碼:
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);
}));
這兩種寫法都是可以的,出來的IL也一樣,但是意義是不同的,后者相當(dāng)于匿名方法,前者
更像是"匿名"的委托,其實(shí)這樣寫:
Thread t2 = new Thread(() =>
{
this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); }));
});
這個(gè)跟上面兩種寫法也是一樣的效果,初次接觸的時(shí)候,可能大家跟我一樣會(huì)有些迷茫,Lamdba表達(dá)式到底該怎么用呢?
首先還是要弄清Lamdba表達(dá)式的幾個(gè)特性:
1. Lamdba 表達(dá)式是一個(gè)委托類型:
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ù)指針是委托類型的
實(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í)也就是委托。
那么為什么我們可以這么寫呢:
MethodInvoker invoker = () => { Console.WriteLine(); };
我們來看一看:
首先,這個(gè)委托的構(gòu)造器需要一個(gè)委托參數(shù),所以通常我們得這樣寫:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
但是匿名的delegate 可以轉(zhuǎn)化成函數(shù)指針 (void() target):
所以這樣寫是可以的:
MethodInvoker invoker = new MethodInvoker(MyFunc);
//而匿名的委托又可以描述為L(zhǎng)ambda表達(dá)式
MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//另外一方面,由于編譯器對(duì)"寬松委托"的支持, MethodInvoker類委托可以轉(zhuǎn)化成匿名類委托:
MethodInvoker invoker = delegate() { Console.WriteLine(); };
//而匿名的委托又可以用Lambda表達(dá)式來描述
MethodInvoker invoker = () => { Console.WriteLine(); };
從上面,我們可以看到一個(gè)復(fù)雜的委托是如何轉(zhuǎn)化成簡(jiǎn)潔的Lambda表達(dá)式的。這對(duì)程序員來說無疑又是提高生產(chǎn)力的一個(gè)體現(xiàn)!
相關(guān)文章
Unity Blend Tree動(dòng)畫混合樹使用入門教程
這篇文章主要為大家詳細(xì)介紹了Unity Blend Tree動(dòng)畫混合樹使用入門教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
asp.net中調(diào)用oracle存儲(chǔ)過程的方法
存儲(chǔ)過程是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL 語句集,存儲(chǔ)在數(shù)據(jù)庫中經(jīng)過第一次編譯后再次調(diào)用不需要再次編譯,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)來執(zhí)行它,下面給大家介紹下asp.net中調(diào)用oracle存儲(chǔ)過程的方法,需要的朋友可以參考下2015-08-08
newtonsoft.json解析天氣數(shù)據(jù)出錯(cuò)解決方法
這篇文章主要介紹了NewtonSoft.JSon解析天氣數(shù)據(jù)時(shí)出錯(cuò)的解決方法,需要的朋友可以參考下2014-02-02

