zoukankan      html  css  js  c++  java
  • Lambda表达式中的表达式lambda和语句lambda区别

    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 表达式转换为表达式树
  • 相关阅读:
    74HC165并转串级联芯片学习记录
    道砟电阻 钢轨阻抗 列车分路电阻
    电压的有效值、平均值与峰值
    铁路信号继电器
    C语言语法记录
    程序编译过程中错误记录
    min-max容斥
    矩阵树定理
    题解 SP1812 【LCS2
    杜教筛
  • 原文地址:https://www.cnblogs.com/dandzm/p/4811330.html
Copyright © 2011-2022 走看看