Lambda表达式也是C#3.0中最重要的特性之一。

1、Lambda表达式的简介

Lambda表达式可以理解为一个匿名方法,它可以包含表达式和语句,并且用于创建委托或转换为表达式树。在使用Lambda表达式时,都会使用“=>”运算符,该运算符的左边是匿名方法的输入参数,右边则是表达式或语句块。

1.1 Lambda表达式的演变过程

其实Lambda表达式是匿名方法的投胎转世。下面以代码来鉴定:

 C# 1.0
Func<string,int> delegatetest1=new Func<string,int>(Callbackmethod); C# 2.0
Func<string,int> delegatetest2=delegate(string text)
{
return text.Length;
} C# 3.0
Func<string,int> delegatetest3=(string text)=>text.Length; 可以省略参数类型string,从而将代码再次简化
Func<string,int> delegatetest4=(text)=text.Length;
此时也可以把圆括号省略
Func<string,int> delegatetest=text=>text.Length;

以上代码形象地掩饰了Lambda表达式是如何由匿名方法演变而来的。

1.2 Lambda表达式的使用

在实际开发过程中,委托的用途莫过于订阅事件了。为了加深大家对Lambda表达式的理解,这里选择演示用Lambda表达式去订阅事件。

 namespace Lambda表达式
{
class Program
{
static void Main(string[] args)
{
Button button1 = new Button() {Text = "点击我"};
button1.Click += (sender, e) => ReportEvent("Click事件", sender, e);
button1.KeyPress += (sender, e) => ReportEvent("KeyPress事件", sender, e);
} private static void ReportEvent(string s, object sender, EventArgs eventArgs)
{
throw new NotImplementedException();
}
}
}

从以上代码可以看出,使用了C# 3.0的对象初始化器和Lambda表达式后,代码确实简洁了不少。

2、表达式也有树结构——表达式树

Lambda表达式除了可以用来创建委托外,还可以转换成表达式树。表达式树(或称“表达式目录树”)是用来表示Lambda表达式逻辑的一种数据结构,它将代码表示成一个对象树,而非可执行代码。其实可以将表达式树理解为一种数据结构,类似栈或队列这种。

2.1 通过Lambda表达式来构造表达式树

 namespace 表达式树
{
class Program
{
static void Main(string[] args)
{
//将Lambda表达式构造成表达式树
Expression<Func<int, int, int>> expressionTree = (a, b) => a + b; //获得表达式树参数
Console.WriteLine($"参数1:{expressionTree.Parameters[0]},参数2:{expressionTree.Parameters[1]}"); //获取表达式树的主体部分
BinaryExpression body = (BinaryExpression) expressionTree.Body; //左节点(每个节点本身就是一个表达式对象)
ParameterExpression left = (ParameterExpression) body.Left; //右节点
ParameterExpression right = (ParameterExpression)body.Right; Console.WriteLine("表达式树主体为:");
Console.WriteLine(expressionTree.Body);
Console.WriteLine($"表达式树左节点为:{left.Name}{Environment.NewLine} 节点类型为:{left.Type}{Environment.NewLine}{Environment.NewLine} 表达式树右节点为:{right.Name}{Environment.NewLine} 节点类型为:{right.Type}{Environment.NewLine}");
Console.ReadKey(); }
}
}

从以上代码可以看出,通过Lambda表达式来构造表达式树的过程非常简单,只需要把Lambda表达式赋给一个表达式树变量就可以了。

2.2 如何把表达式树转换成可执行代码

 namespace 表达式树2
{
class Program
{
static void Main(string[] args)
{
//将Lambda表达式构造成表达式树
Expression<Func<int, int, int>> expressionTree = (a, b) => a + b;
//通过调用complie方法来生成Lambda表达式的委托
Func<int, int, int> delinstance = expressionTree.Compile();
//调用委托实例获得结果
int result = delinstance(, );
Console.WriteLine($"2和3的和为:{result}");
Console.ReadKey();
}
}
}

以上代码通过Expression<TDelegate>类的Compile()方法将表达式树编译成委托实例,然后通过委托调用的方式得到两个数的和。

不一样的编码风格--Lambda表达式的更多相关文章

  1. 不一样的风格,C#的lambda表达式

    下面贴出代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  2. Java8 Lambda表达式和流操作如何让你的代码变慢5倍

    原文出处:ImportNew 有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格——iterator 和 for- ...

  3. 初探Lambda表达式/Java多核编程【3】Lambda语法与作用域

    接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍L ...

  4. Python PEP-8编码风格指南中文版

    #PEP 8 – Python编码风格指南 PEP: 8 Title: Style Guide for Python Code Author: Guido van Rossum , Barry War ...

  5. Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】

    原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...

  6. Java 下一代: 函数式编码风格——Groovy、Scala 和 Clojure 共享的函数结构及其优势

    原文地址 本文内容 命令式处理 函数式处理 函数式编程的优势 所有 Java 下一代语言都包括函数式编程结构,让您可以从一个更高的抽象层面来思考问题.然而,语言间术语的不同使得难以看到类似的结构.本期 ...

  7. Python 编码风格指南

    原文:http://python.jobbole.com/84618/ 本文超出 PEP8 的范畴以涵盖我认为优秀的 Python 风格.本文虽然坚持己见,却不偏执.不仅仅涉及语法.模块布局等问题,同 ...

  8. [中英对照]Linux kernel coding style | Linux内核编码风格

    Linux kernel coding style | Linux内核编码风格 This is a short document describing the preferred coding sty ...

  9. (转)PEP 8——Python编码风格指南

    PEP 8——Python编码风格指南标签(空格分隔): Python PEP8 编码规范原文:https://lizhe2004.gitbooks.io/code-style-guideline-c ...

随机推荐

  1. plsql的参数IN和OUT

    代码片段一 create or replace procedure scott.pro_para_inout(p_dname in out scott.dept.dname%TYPE, p_loc o ...

  2. leecode 树的平衡判定 java

    以前写过c++版本的,感觉java写的好舒心啊/** * Definition for binary tree * public class TreeNode { * int val; * TreeN ...

  3. MapReduce自定义类输出的内容为内存地址

    13480253104 mapreduce.KpiWritable@486a58c4 13502468823 mapreduce.KpiWritable@3de9d100 13560439658 ma ...

  4. POJ1006 - Biorhythms(中国剩余定理)

    题目大意 略...有中文... 题解 就是解同余方程组 x≡(p-d)(mod 23) x≡(e-d)(mod 28) x≡(i-d)(mod 33) 最简单的中国剩余定理应用.... 代码: #in ...

  5. Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区

    Lua包管理工具Luarocks详解 - 15134559390的个人空间 - 开源中国社区 Lua包管理工具Luarocks详解

  6. 简述configure、pkg-config、pkg_config_path三者的关系

    简述configure.pkg-config.pkg_config_path三者的关系 一.什么是configure 源码安装过程中大多会用到configure这个程序,一般的configure都是一 ...

  7. UML建模系列文章总结

    本文转载:http://www.cnblogs.com/ywqu/tag/UML建模/ 本人总结: UML类图按照关系分为三大类:继承关系.拥有关系.整体与部分的关系. 继承关系:泛化.实现 拥有关系 ...

  8. Oracle Linux 6.3下安装Oracle 11g R2(11.2.0.3)

    本文主要描写叙述了在Oracle Linux 6.3下安装Oracle 11gR2(11.2.0.3).从Oracle 11g開始,Oracle官方站点不再提供其Patch的下载链接,须要使用Meat ...

  9. MySQL启动和关闭服务命令

    MySQL启动和关闭服务命令 1.启动服务命令 net start mysql 2.关闭服务命令 net stop mysql

  10. EditPlus保存文件时不生成其备份文件的方法

    3.将“保存时去掉备份文件”复选框去掉,点击 应用->确定,即可 .