(轉) Lambda運算式中的運算式lambda和語句lambda區別

來源:互聯網
上載者:User

標籤:

運算式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的數,然後輸出來,結果如下

輸出結果一樣。

查看反編譯後的代碼

看來編譯器做了處理,兩者的代碼都是一樣了,既然這樣,那麼在語句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);            }        }    }}

再查看反編譯後的代碼

再來看下IL代碼

 

可以看到,無論是運算式lambda還是語句lambda,最後都產生一個方法,這裡產生的方法分別是和,然後將方法賦給委託變數,就是這部分:

所以,給委託變數賦值時,運算式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 運算式轉換為運算式樹狀架構

(轉) Lambda運算式中的運算式lambda和語句lambda區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.