一、  "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

二、下面代码演示怎么从一个匿名函数(方法) 推导出一个Lambda表达式:

1.首先通过一个匿名方法来创建委托实例,传入一个方法作为变量:

  public void Test()
{
Func<string, string> funcToUpper; //定义一个委托实例,输入参数、返回值都是string类型
funcToUpper = Upper; //传入一个方法变量
Console.WriteLine(funcToUpper("lxsh"));
}
public string Upper(string str)
{
return str.ToUpper();
}

2.Upper可以转化一个匿名方法,针对方法体只有一行或者几行的,为了方便代码可阅读性,不建议单独维护一个方法,只需做一个匿名方法既可以

 public void Test()
{
Func<string, string> funcToUpper; //定义一个委托实例,输入参数、返回值都是string类型
//funcToUpper = Upper; //传入一个方法变量
funcToUpper = delegate (string str){return str.ToUpper();};
Console.WriteLine(funcToUpper("lxsh"));
}

3.在C#3.0语法中出现了"=>"(goes to)语法糖,他可以替换匿名方法;该语法就是Lambda 表达式,

  public void Test()
{
Func<string, string> funcToUpper; //定义一个委托实例,输入参数、返回值都是string类型
//funcToUpper = Upper; //传入一个方法变量
// funcToUpper = delegate (string str){return str.ToUpper();}; //匿名方法
funcToUpper = (string str)=>{return str.ToUpper();};
Console.WriteLine(funcToUpper("lxsh"));
}

4.到第三步为止Lambda 表达式其实看起来和匿名方法一样,然并没有节省多大空间,或并没有增加代码的可读性,下面讲一下Lambda 表达式的快捷语法,

第一个快捷语法:以省略参数类型,因为定义委托的时候已经设置好了参数类型,它可以自动推算参数类型;且当只有一个参数的时候可以去掉小括号,

  public void Test()
{
Func<string, string> funcToUpper; //定义一个委托实例,输入参数、返回值都是string类型
//funcToUpper = Upper; //传入一个方法变量
//funcToUpper = delegate (string str){return str.ToUpper();}; //匿名方法
//funcToUpper = (string str)=>{return str.ToUpper();};
funcToUpper = str=>{return str.ToUpper();};
Console.WriteLine(funcToUpper("lxsh"));
}

第二快捷语法:当方法体只有一行时可以去掉大括号,且如果有返回值可以去掉return

public void Test()
{
Func<string, string> funcToUpper; //定义一个委托实例,输入参数、返回值都是string类型
//funcToUpper = Upper; //传入一个方法变量
//funcToUpper = delegate (string str){return str.ToUpper();}; //匿名方法
//funcToUpper = (string str)=>{return str.ToUpper();};
// funcToUpper = str=>{return str.ToUpper();};
funcToUpper = str=> str.ToUpper();
Console.WriteLine(funcToUpper("lxsh"));
}

5.从匿名方法到Lambda 表达式完整的演变过程如下:

匿名方法是怎样演变到Lambda表达试过程的更多相关文章

  1. 18、(番外)匿名方法+lambda表达式

    概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿 ...

  2. 委托、匿名方法到lambda表达式

    在项目中我们经常会接触lambda表达式,链式操作简洁明了.帮我们省了不少事.面对这么神奇的一个东西,是不是也应该了解了解它的本质呢. 今天我们通过一步一步的演变揭开lambda表达式的本质 一.委托 ...

  3. 委托,匿名方法,Lambda,泛型委托,表达式树

    一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step0 ...

  4. lambda 委托 匿名方法

    委托: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的 ...

  5. 无法将匿名方法转换为System.Delegate

    在WinForm中,不允许非UI线程访问UI,如果非UI线程需要跨线程调用UI控件,通常的解决办法是使用Control类中的Invoke方法,传递给该方法一个委托和委托调用的参数列表(params [ ...

  6. 【C#复习总结】细说匿名方法

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  7. C#2.0新增功能03 匿名方法

    连载目录    [已更新最新开发文章,点击查看详细] 在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法. C# 2.0 引入匿名方法,在 C# 3.0 及更高版本中,Lambda 表 ...

  8. 匿名方法、Lambda表达和自定义泛型委托以及Func、Action系统泛型委托

    1.匿名方法的概念:一个方法没有具体的名称,而只有关键字delegate.方法参数.方法体.这种方法是匿名方法. 匿名方法的好处:将具体方法和委托直接关联在一起,如果我们基于委托只需要一个方法的时候, ...

  9. c#-委托,匿名方法,lambda表达的关系

    什么是委托: 包含单个方法的委托和函数指针是相似的,不同的是,委托是面向帝乡的并且是类型安全的 声明委托类型: delegate void mydel(int x); 声明委托和声明方法差不多,两个不 ...

随机推荐

  1. 基于记忆性的中值滤波O(r)与O(1)复杂度的算法实现

    本文参考博客:https://www.cnblogs.com/Imageshop/archive/2013/04/26/3045672.html 原生的中值滤波是基于排序算法的,这样的算法复杂度基本在 ...

  2. idea把菜单栏给点没了...(File、Edit、View、Navigate.......)

    第一种方法 找到idea的C盘的配置文件ui.lnf.xml文件 第二种方法 如果是高版本idea,我的是2019.3,双击shift选择Actions,搜索menu 然后重启idea

  3. 【IDE_IntelliJ IDEA】idea中设置类和方法的注释模板

    参考博文:idea生成类注释和方法注释的正确方法

  4. eclipse springboot工程打war包方法及在Tomcat中运行的方法

    一, eclipse springboot打war包 1. 配置pom.xml文件 <packaging>war</packaging> <!-- 配置servlet,打 ...

  5. Confluence 邮箱设置

    Confluence有两种方法设置邮箱 原理: confluence服务器配置好邮箱信息,用户触发邮件发送规则时,confluence服务使用已配置的邮箱信息登录到邮箱服务器,进行发件服务. 那么我们 ...

  6. Jenkins + Pipeline + Git + Maven (十)

    一.准备环境介绍 192.168.5.71 # gitlab 仓库IP 192.168.5.72 # 开发环境,用于提交代码等 192.168.5.73 # tomcat 部署solo服务站点 192 ...

  7. JAVAWEB复习-JS

    1.概述 JavaScript是基于对象和事件的脚本语言,主要应用在客户端 特点:信息动态交互,不可直接访问本地磁盘,只要是可以解析js的浏览器都可以跨平台执行 2.JS和JAVA比较 a:JS是面向 ...

  8. pdfium:创建CreateNewDoc

    CreateNewDoc  //创建文档   https://github.com/PureFusionOS/android_external_pdfium/blob/040b899a933cdb37 ...

  9. mac os下切换pip3国内源并安装requests库

    在使用Python的时候,经常会用到pip来安装模块,但是默认的下载源实在是特别慢,经常install的时候还会因为速度的原因直接报错,因此我们可以选择将下载源更改为国内的,这样就可以提高我们的下载速 ...

  10. mwArray和cv::Mat转化函数 20170812

    不是新东西了,但是有必要专门把这两个函数拿出来记录一下. 需要注意的是,Mat2mwArry函数的输入Mat类型是 CV_8UC1,灰度图. 如果要传递多通道图像的话,需要先cv::split()成多 ...