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

Lambda表達式可分爲表達式lambda和語句lambdaexpress

表達式lambda:表達式位於 => 運算符右側的lambda表達式稱爲表達式lambda測試

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

例如spa

(x, y) => x == y

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

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

例如:code

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

這二者除了寫法不同,還有什麼區別嗎,用如下代碼做爲測試blog

複製代碼
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的數,而後輸出來,結果以下get

image

輸出結果同樣。input

查看反編譯後的代碼編譯器

image

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

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 表達式轉換爲表達式樹                  

 

//可是他們均可以賦給一個Func

Func<int, int, int> fun = (a, b) => a + b;//正確 Func<int, int, int> fun1 = (a, b) => { return a + b; };//正確

相關文章
相關標籤/搜索