懂得C#中的Lambda表達式。本站提示廣大學習愛好者:(懂得C#中的Lambda表達式)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得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();
}
我們曉得, 當結構一個新的拜托的時刻, 他的結構器須要一個函數指針作參數,這個函數指針是拜托類型的
現實上,當我們如許去new 一個拜托的時刻:
MethodInvoker invoker = new MethodInvoker(MyFunc);
"MyFunc" 就是一個拜托,而不只是一個函數名的存在. 編譯器將為這個結構函數生成一個匿名拜托:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
可以如許懂得編譯器的行動: 匿名辦法其實也就是拜托。
那末為何我們可以這麼寫呢:
MethodInvoker invoker = () => { Console.WriteLine(); };
我們來看一看:
起首,這個拜托的結構器須要一個拜托參數,所以平日我們得如許寫:
MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
然則匿名的delegate 可以轉化成函數指針 (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表達式的。這對法式員來講無疑又是進步臨盆力的一個別現!