国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Lambda表達式中的表達式lambda和語句lambda區別

2019-11-14 14:00:29
字體:
來源:轉載
供稿:網友

Lambda表達式可分為表達式lambda和語句lambda

表達式lambda:表達式位于 => 運算符右側的lambda表達式稱為表達式lambda

(input parameters) => exPRession     //表達式lambda

例如

(x, y) => x == y

語句lambda:=> 運算符右側是一個語句塊,語句包含在大括號中

(input parameters) => {statement;}  //語句lambda

例如:

(x, y) => {return x == y;}

這兩者除了寫法不一樣,還有什么區別嗎,用以下代碼作為測試

using System;using System.Collections.Generic;namespace LinqTest{    class Program    {        static void Main(string[] args)        {            List<int> list = new List<int> { 1, 3, 2, 4 };            var resultUsingExpressionLambda = list.FindAll(p => p < 3);            Console.WriteLine("使用表達式lambda:");            foreach (var item in resultUsingExpressionLambda)            {                Console.WriteLine(item);            }            var resultUsingStatementLambda = list.FindAll(p =>            {                return p < 3;            });            Console.WriteLine("使用語句lambda:");            foreach (var item in resultUsingStatementLambda)            {                Console.WriteLine(item);            }        }    }}

代碼比較簡單,就是分別使用表達式lambda和語句lambda找出小于3的數,然后輸出來,結果如下

image

輸出結果一樣。

查看反編譯后的代碼

image

看來編譯器做了處理,兩者的代碼都是一樣了,既然這樣,那么在語句lambda中多加一行代碼,Console.WriteLine(p); 這樣就不會生成一樣的代碼了

Console.WriteLine(p.ToString());

using System;using System.Collections.Generic;namespace LinqTest{    class Program    {        static void Main(string[] args)        {            List<int> list = new List<int> { 1, 3, 2, 4 };            var resultUsingExpressionLambda = list.FindAll(p => p < 3);            Console.WriteLine("使用表達式lambda:");            foreach (var item in resultUsingExpressionLambda)            {                Console.WriteLine(item);            }            var resultUsingStatementLambda = list.FindAll(p =>            {                Console.WriteLine(p);//這是新加的                return p < 3;            });            Console.WriteLine("使用語句lambda:");            foreach (var item in resultUsingStatementLambda)            {                Console.WriteLine(item);            }        }    }}

再查看反編譯后的代碼

image

再來看下IL代碼

image

 

image

可以看到,無論是表達式lambda還是語句lambda,最后都生成一個方法,這里生成的方法分別是imageimage,然后將方法賦給委托變量,就是這部分:

image

所以,給委托變量賦值時,表達式lambda和語句lambda寫法不一樣,但是最后編譯器都生成一個方法。

還有個不同點,表達式lambda可以轉換為類型Expression<T>的表達式樹,而語句lambda不可以

Expression<Func<int, int, int>> expression = (a, b) => a + b;//正確Expression<Func<int, int, int>> expression1 = (a, b) => { return a + b; };//錯誤,無法將具有語句體的 lambda 表達式轉換為表達式樹

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禹城市| 林芝县| 千阳县| 济源市| 太保市| 莱阳市| 佛坪县| 河东区| 教育| 嵩明县| 炎陵县| 丰宁| 巴林右旗| 花垣县| 邻水| 云安县| 茌平县| 澳门| 肇庆市| 万全县| 梨树县| 汉沽区| 沅陵县| 长子县| 西峡县| 吴江市| 台前县| 鹤庆县| 台东县| 呼和浩特市| 赣州市| 广丰县| 岗巴县| 双柏县| 仁寿县| 淮阳县| 平凉市| 伊金霍洛旗| 都匀市| 乌拉特前旗| 澳门|