一、  "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. 【MongoDB详细使用教程】三、高级查询

    目录 1.使用比较运算符查询 2.使用关键字查询 2.1.in/not in 关键字 2.2.size 关键字 2.3.exists 关键字 2.4.or 关键字 3.模糊查询 4.查询结果排序 5. ...

  2. 《Linux就该这么学》课堂笔记01 linux初识

    此书作者刘遄(Liu Chuán)从事于Linux运维技术行业,并且在2012年获得红帽工程师RHCE 6版本证书,在2015年初又分别获得红帽工程师RHCE 7版本证书与红帽架构师认证RHCA顶级证 ...

  3. RabbitMQ的几个常见问题

    1. 如何保证消息尽量发送成功? 问题描述: 如果没有启动消费者,重启了RabbitMQ服务,队列和消息都会丢失. 解决方案: 针对这个问题,有以下几个机制可以解决: 生产者确认: 持久化: 手动AC ...

  4. selenium 2定位方式实例

    #########百度输入框的定位方式########## #通过id方式定位 browser.find_element_by_id("kw").send_keys("s ...

  5. 【Android】从Eclipse到AndroidStudio的工程迁移

    1.新建Android Studio的代码目录 2.打开AS,选择File---->New---->Import Project 3.在弹出的对话框选择Eclispe代码目录 4.选择Ec ...

  6. ESP8266 SDK开发: 外设篇-GPIO输出高低电平

    前言 官方提供了两个函数 GPIO_OUTPUT_SET(gpio_no, bit_value) 设置GPIO2输出高电平 GPIO_OUTPUT_SET(2, 1); 设置GPIO2输出低电平 GP ...

  7. requests--超时设置,代理设置,身份认证

    超时设置 你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应.基本上所有的接口都应该使用这一参数.如果不使用,你的程序可能会永远失去响应 import requ ...

  8. Linux构建DNS主从服务器

    所有服务器:iptables -Fsystemctl stop firewalldsetenforce 0 配置yum 主服务器:[root@localhost ~]# yum -y install ...

  9. CF1175F The Number of Subpermutations

    题目链接 题意 给出一个长度为\(n\)的序列\(a\),问有多少个区间\([l,r]\)满足:在区间\([l,r]\)内,\([1,r-l+1]\)的每个整数都恰好出现了一次. \(n \le 3 ...

  10. Bootstrap-table 单元格合并 、表头合并

    1.页面引入js/css @*1.Jquery组件引用*@ <script src="~/Scripts/jquery-1.10.2.js"></script&g ...