形參清單=>函數體
函數體多于一條語句的可用大括号括起。
可以将此表達式配置設定給委托類型,如下所示:
1
2
3
<code>delegate</code><code>int</code><code>del(</code><code>int</code><code>i);</code>
<code>del myDelegate = x => { </code><code>return</code><code>x * x; };</code>
<code>int</code><code>j = myDelegate(5); </code><code>//j = 25</code>
建立表達式目錄樹類型:
<code>using</code><code>System.Linq.Expressions;</code>
<code>// ...</code>
<code>Expression<del> = x => x * x;</code>
Lambda 用在基于方法的 LINQ 查詢中,作為諸如 Where 和 Where 等标準查詢運算符方法的參數。
使用基于方法的文法在 Enumerable 類中調用 Where 方法時(像在 LINQ to Objects 和 LINQ to XML 中那樣),參數是委托類型 System..::.Func<(Of <(T, TResult>)>)。使用 Lambda 表達式建立委托最為友善。例如,當您在 System.Linq..::.Queryable 類中調用相同的方法時(像在 LINQ to SQL 中那樣),則參數類型是 System.Linq.Expressions..::.Expression<Func>,其中 Func 是包含至多五個輸入參數的任何 Func 委托。同樣,Lambda 表達式隻是一種用于構造表達式目錄樹的非常簡練的方式。盡管事實上通過 Lambda 建立的對象的類型是不同的,但 Lambda 使得 Where 調用看起來類似。
在 is 或 as 運算符的左側不允許使用 Lambda。
Lambda 表達式無法從封閉方法中直接捕獲 ref 或 out 參數。
Lambda 表達式中的傳回語句不會導緻封閉方法傳回。
<code>string</code><code>[] names = { </code><code>"agen"</code><code>, </code><code>"balen"</code><code>, </code><code>"coure"</code><code>, </code><code>"apple"</code><code>};</code>
<code>string</code><code>[] findNameA = Array.FindAll<</code><code>string</code><code>>(names, </code><code>delegate</code><code>(</code><code>string</code><code>v) { </code><code>return</code><code>v.StartsWith(</code><code>"a"</code><code>); });</code>
<code>string</code><code>[] findNameB = Array.FindAll<</code><code>string</code><code>>(names, v => v.StartsWith(</code><code>"a"</code><code>));</code>
上面中兩個FindAll方法的反編譯代碼如下:
<code>string</code><code>[] findNameA = Array.FindAll<</code><code>string</code><code>>(names, </code><code>delegate</code><code>(</code><code>string</code><code>v) { </code><code>return</code><code>v.StartsWith(</code><code>"a"</code><code>); } );</code>
<code>string</code><code>[] findNameB = Array.FindAll<</code><code>string</code><code>>(names, </code><code>delegate</code><code>(</code><code>string</code><code>v) { </code><code>return</code><code>v.StartsWith(</code><code>"a"</code><code>); } );</code>
Lambda表達式的文法格式:
參數清單 => 語句或語句塊
其中“參數列”中可包含任意個參數(與委托對應),如果參數列中有0個或1個以上參數,則必須使用括号包覆參數列,如下:
() => Console.Write("0個參數")
I => Console.Write("1個參數時參數列中可省略括号,值為:{0}",i)
(x,y) => Console.Write("包含2個參數,值為:{0}*{1}",x,y)
而“語句或語句塊”中如果隻有一條語句,則可以不用大括号包覆否則則必須使用,如下:
I => Console.Write("隻有一條語句")
I => { Console.Write("使用大括号的表達式"); }
//兩條語句時必須要大括号
I => { i++;Console.Write("兩條語句的情況"); }
“Lambda表達式”是委托的實作方法,是以必須遵循以下規則:
1)“Lambda表達式”的參數數量必須和“委托”的參數數量相同;
例子:
4
5
6
7
8
9
10
11
12
13
14
15
<code>class</code><code>Test</code>
<code>{</code>
<code></code><code>delegate</code><code>int</code><code>AddHandler(</code><code>int</code><code>x, </code><code>int</code><code>y);</code>
<code></code><code>static</code><code>void</code><code>Print(AddHandler add)</code>
<code></code><code>{</code>
<code></code><code>Console.Write(add(1, 3));</code>
<code></code><code>}</code>
<code></code><code>static</code><code>void</code><code>Main()</code>
<code></code><code>Print( (x, y) => x + y );</code>
<code></code><code>Print( (x, y) => { </code><code>int</code><code>v = x * 10; </code><code>return</code><code>y + v; } );</code>
<code></code><code>Console.Read();</code>
<code>}</code>
3)如果“委托”有傳回類型,則“Lambda表達式”的“語句或語句塊”中也必須傳回相同類型的資料;
16
17
18
19
20
<code></code><code>delegate</code><code>T AddHandler<T>(T x, T y);</code>
<code></code><code>static</code><code>void</code><code>Print(AddHandler<</code><code>int</code><code>> test)</code>
<code></code><code>Console.WriteLine(</code><code>"int type:{0}"</code><code>, test(1, 2));</code>
<code></code><code>static</code><code>void</code><code>Print(AddHandler<</code><code>double</code><code>> test)</code>
<code></code><code>Console.WriteLine(</code><code>"double type:{0}"</code><code>, test(1d, 2d));</code>
在以下方法或屬性之間的調用不明确:
“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<int>)”和“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<double>)”
<code>Print( (</code><code>int</code><code>x, </code><code>int</code><code>y) => x + y );</code>
這樣我們的代碼就能編譯通過了。
本文轉自 我不會抽煙 51CTO部落格,原文連結:http://blog.51cto.com/zhouhongyu1989/1369083,如需轉載請自行聯系原作者