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. zookeeper系列(一)安装

    zookeeper是一个分布式应用协调服务,主要用来解决分布式应用配置项的管理.同步服务.集群管理等,它由Java语言编写,但它支持Java和C两种编程语言接口:   环境部署 操作系统:centos ...

  2. ASIHTTPRequest 中url参数中文乱码

    ASIHTTPReques确实是在开发过程中,数据的传输,获取方面给我们很大的帮助.然而在一些方面也是需要一些的注意. 在我们使用ASIHTTPReques 进行get方式获取数据时,如果需要传入中文 ...

  3. java中用线程解决进出水问题

    //进水 class Inflow implements Runnable{ //水对象 Water wat; public Inflow(Water w){ this.wat = w; } @Ove ...

  4. java+数据库+D3.js 实时查询人物关系图

    先看下 效果 某个用户,邀请了自己的朋友 ,自己的朋友邀请了其他朋友,1 展示邀请关系,2 点击头像显示邀请人和被邀请人的关系.(网上这种资料很少, 另外很多都是从JSON文件取 数据, 这里是从数据 ...

  5. RichTextBox返回值标记不同颜色

    在Button按钮下,将脚本的执行结果返回到richtextbox中: 如果返回值包含“failed",则该行标记为红色 .\Scripts\升级_ERP.ps1 | % { If ($_. ...

  6. Visual C++ 2012/2013的内存溢出检測工具

    在过去,每次编写C/C++程序的时候,VLD差点儿是我的标配.有了它,就能够放心地敲代码,随时发现内存溢出. VLD最高可支持到Visual Studio 2012.不知道以后会不会支持Visual ...

  7. hibernate笔记加强版

    hibernate 一. hibernate介绍 hibernate事实上就是ormapping框架,此框架的作用就是简单话数据库的操作. hibernate就是将用户提交的代码.參照持久化类配置文件 ...

  8. RHCA442学习笔记-Unit10内存地址及分配

      Unit 10 Memory Addressing and Allocation 内存地址及分配 学习目标: A. 虚拟地址与物理地 B. 调整内存地址分配 C. 解析内存溢出    10.1 O ...

  9. Cocos-2d 坐标系及其坐标转换

    Cocos-2d中,涉及到4种坐标系: GL坐标系Cocos2D以OpenglES为图形库,所以它使用OpenglES坐标系.GL坐标系原点在屏幕左下角,x轴向右,y轴向上. 屏幕坐标系苹果的Quar ...

  10. Linux--------------安装vim

    1.相关提示        -bash: vim: command not found    2.查看vim是否安装        rpm -qa|grep vim            vim-en ...