理解C#中的Lambda表達式
先來看兩段代碼:
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也一樣,但是意義是不同的,后者相當于匿名方法,前者
更像是"匿名"的委托,其實這樣寫:
Thread t2 = new Thread(() =>
{
this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); }));
});
這個跟上面兩種寫法也是一樣的效果,初次接觸的時候,可能大家跟我一樣會有些迷茫,Lamdba表達式到底該怎么用呢?
首先還是要弄清Lamdba表達式的幾個特性:
1. Lamdba 表達式是一個委托類型:
MethodInvoker invoker = () => { Console.WriteLine(); };
//is actually equal to the following form.
MethodInvoker invoker = delegate() { Console.WriteLine(); };
//這里是Lamdba 表達式的匿名委托的用法
2. Lamdba 表達式可以用作匿名方法
MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//相當于:
MethodInvoker invoker = new MethodInvoker(MyFunc);
partial void MyFunc()
{
Console.WriteLine();
}
我們知道, 當構造一個新的委托的時候, 他的構造器需要一個函數(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 可以轉化成函數(shù)指針 (void() target):
所以這樣寫是可以的:
MethodInvoker invoker = new MethodInvoker(MyFunc);
//而匿名的委托又可以描述為Lambda表達式
MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//另外一方面,由于編譯器對"寬松委托"的支持, MethodInvoker類委托可以轉化成匿名類委托:
MethodInvoker invoker = delegate() { Console.WriteLine(); };
//而匿名的委托又可以用Lambda表達式來描述
MethodInvoker invoker = () => { Console.WriteLine(); };
從上面,我們可以看到一個復雜的委托是如何轉化成簡潔的Lambda表達式的。這對程序員來說無疑又是提高生產(chǎn)力的一個體現(xiàn)!
相關文章
C#將隱私信息(銀行賬戶,身份證號碼)中間部分特殊字符替換成*
大家在銀行交易某些業(yè)務時,都可以看到無論是身份證、銀行賬號中間部分都是用*號替換的,下面這篇文章主要介紹C#將隱私信息(銀行賬戶,身份證號碼)中間部分特殊字符替換成*的相關資料,需要的朋友可以參考下2015-08-08通過VS中的數(shù)據(jù)源選擇對話框簡單實現(xiàn)數(shù)據(jù)庫連接配置[圖]
通過VS中的數(shù)據(jù)源選擇對話框簡單實現(xiàn)數(shù)據(jù)庫連接配置[圖]...2007-03-03C#程序中使用LINQ to XML來查詢XML格式數(shù)據(jù)的實例
這篇文章主要介紹了C#程序中使用LINQ to XML來查詢XML格式數(shù)據(jù)的實例,LINQ to XML是.NET框架中集成的接口,可以將XML數(shù)據(jù)放到內存中進行處理,需要的朋友可以參考下2016-03-03C#使用Sleep(Int32)方法實現(xiàn)動態(tài)顯示時間
這篇文章主要為大家詳細介紹了C#如何使用Sleep(Int32)方法實現(xiàn)動態(tài)顯示時間,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下2024-01-01