从委托的角度来看,Lambda表达式与匿名方法没有区别。在【C#基础:匿名方法】一文中,我使用了匿名方法来调用List<T>的FindAll方法。从C# 3.0开始,在使用匿名方法的地方,完全可以用Lambda表达式来代替。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有相同优先级的右结合运算符,在英语里读作:“goes to”。

现在回过头来看我们的例子。下面的代码与【C#基础:匿名方法】一文中的代码具有相同的效果:

view plaincopy to clipboardprint?
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> names = new List<string>();
  6. names.Add("Sunny Chen");
  7. names.Add("Kitty Wang");
  8. names.Add("Sunny Crystal");
  9. List<string> found = names.FindAll
  10. (
  11. // Lambda Expression Implementation
  12. name => name.StartsWith(
  13. "sunny",
  14. StringComparison.OrdinalIgnoreCase)
  15. );
  16. if (found != null)
  17. {
  18. foreach (string str in found)
  19. Console.WriteLine(str);
  20. }
  21. }
  22. }

上面的Lambda Expression Implementation在效果上与匿名方法没有任何区别,“=>”左边的name定义了参数(当参数个数为1的时候,圆括号可以省略),“=>”右边定义执行体。由于C# 3.0编译器具有Type Inference的能力,参数类型与返回值都将由编译器通过上下文判定,因此与匿名方法不同,Lambda表达式的参数可以不给定参数类型。当所表示的匿名方法没有任何参数时,Lambda表达式也同样可以使用,只需在“=>”左边用一对圆括号表示即可。即:

view plaincopy to clipboardprint?
  1. () => Console.WriteLine("Hello!");

事实上,“Lambda表达式”这一词比较笼统,事实上“=>”运算符既可以表示Lambda表达式,也可以表示Lambda语句。Lambda语句由代码块组成,形式上很像匿名方法。请看下面的例子:

view plaincopy to clipboardprint?
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. // Lambda 表达式
  6. Func<int, bool> dele1 = n => n > 10;
  7. // Lambda 语句
  8. Func<int, bool> dele2 = (int n) => { return n > 10; };
  9. Console.WriteLine(dele1(16));
  10. Console.WriteLine(dele1(8));
  11. }
  12. }

两种定义方法同样可以正确地输出结果。请注意,当我们希望构建表达式树的时候,情况却完全不同了:

view plaincopy to clipboardprint?
  1. // ok
  2. Expression<Func<int, bool>> expr1 = n => n > 10;
  3. // error: cannot converted to an expression tree
  4. Expression<Func<int, bool>> expr2 = (int n) => { return n > 10; };

由此可见,在构建表达式树的时候,不能用Lambda语句(带有代码语句的Lambda表达式),而应该使用Lambda表达式。从这里就可以看出匿名方法与Lambda表达式的区别了。

有关委托的高级话题以及表达式树的内容,我会在后面的文章中继续研究。

C#基础:Lambda表达式相关推荐

  1. Java基础-Lambda表达式基础练习

    Lambda表达式基础练习 Lambda表达式得格式:(形式参数)->{代码块} Lambda表达式使用前提: 有一个接口 接口中有且仅有一个抽象方法 练习1:定义一个接口(Eatable),里 ...

  2. Java基础-Lambda表达式

    Lambda表达式 Lambda表达式概述 Lambda表达式语法 Lambda表达式案例 Lambda表达式总结 Lambda表达式概述 Lambda 表达式,也可称为闭包,它是推动 Java 8 ...

  3. Java 基础 —— Lambda 表达式

    概述 阅读项目代码时,尤其是阅读一些源码时,经常会遇到 Lambda 表达式.对此之前看过相关文章,但是停留在模模糊糊的印象上.今天趁着有时间,通过一些 demo 示例,梳理一下它的用法,以备后期遗忘 ...

  4. Python基础 lambda表达式

    # -*- coding: utf-8 -*-fun1 = lambda x,y : x + y print('fun1(2,3)=' , fun1(2,3)) # fun1(2,3)= 5fun2 ...

  5. [Java基础]Lambda表达式和匿名内部类的区别

  6. [Java基础]Lambda表达式的注意事项

  7. [Java基础]Lambda表达式的省略模式

  8. [Java基础]Lambda表达式的格式与使用前提

  9. [Java基础]Lambda表达式练习

    代码如下: package LambdaPracticePack;public interface Eatable {void eat(); } package LambdaPracticePack; ...

  10. 刻意练习:Python基础 -- Task05. 函数与Lambda表达式

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

最新文章

  1. LVM 逻辑卷的扩容/缩容
  2. JavaScript递归应用与实践
  3. java 定时还款 技术_详解java定时任务
  4. springboot实现语言切换
  5. PHP怎么做成Qq空间相册,美化QQ空间相册的照片4步走 让你轻松学会PS
  6. umount target is busy
  7. android画图奥运五环,Android 自定义View 画圆(奥运五环)
  8. Swagger设置密码登录
  9. J2EE学习推荐书籍
  10. B站视频下载器,超清4k视频下载,一键解析视频合集,支持批量下载提取视频封面
  11. 【Kafka】Kafka的Rebalance机制可能造成的影响及解决方案
  12. 6种提高客户满意度的方法
  13. 初探Java设计模式5:一文了解Spring涉及到的9种设计模式
  14. 微星主板黑苹果_小白安装黑苹果应该要知道的事情
  15. 【艾特淘】什么是手淘搜索流量?
  16. 产品市场研究的方法有哪些
  17. 【计算机网络】冗余码计算
  18. 论文笔记——Stitcher:Feedback-driven Data Provider for Object Detection
  19. spss分析qpcr数据_实时荧光定量PCR的三种数据分析方法比较.doc
  20. 系统架构之业务逻辑层

热门文章

  1. getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快
  2. Java牛客专项练习2020.12.10
  3. C++STL与泛型编程(2) 第一个C++ STL Application
  4. 2013驾考科目三考试难点解析
  5. 基于OpenCL的mean filter性能
  6. 10岁起编程,并不认为自己是“黑客”
  7. H264基本概念之 宏块、片和片组
  8. sps及pps在解码器内传递过程
  9. IntelliJ IDEA中新建JAVA WEB项目、maven项目
  10. js 实现用window.print()打印页面中的部分内容,局部打印