在C#2.0引入匿名方法之前,声明委托的唯一方法就是使用命名方法,C#2.0之后的C#3.0中开始引入了Lambda表达式取代了匿名方法。

匿名方法

要说Lambda必然离不开匿名方法,实际上,Lambda的本质就是一个匿名方法,上代码

  1. class Program
  2. {
  3.  
  4. delegate void SayHello(string name);
  5.  
  6. public static void Main(string[] args)
  7. {
  8. SayHello sh1 = HelloMethod;
  9.  
  10. SayHello sh2 = delegate (string name)//匿名方法
  11. {
  12. Console.WriteLine("Hello:" + name);
  13. };
  14.  
  15. sh1("jiming1");
  16. sh2("jiming2");
  17.  
  18. Console.Read();
  19. }
  20.  
  21. public static void HelloMethod(string name)
  22. {
  23. Console.WriteLine("Hello:" + name);
  24. }
  25. }

上述代码中,首先定义了一个委托SayHello,注册到改委托的方法需要有一个string类型的参数,第一个委托对象sh1直接使用的是命名方法HelloMethod,第二个委托对象sh2使用的就是匿名方法.

Lambda表达式

lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。参数的个数可以是0、1或多个,只有当输入参数是1个时,Lambda表达式左边的小阔海才可以省略

示例:

  1. public static void Main(string[] args)
  2. {
  3. Action action = new Action(() => Console.WriteLine("0参数Lambda"));
  4. action.Invoke();
  5.  
  6. Console.Read();
  7. }

分析:上述代码中,他输入的参数是0,方法主体打印"0参数Lambda"

示例2:

  1. public static void Main(string[] args)
  2. {
  3. Func<int,int> func = new Func<int,int>(m=>m*);
  4.  
  5. Console.WriteLine(func.Invoke());
  6.  
  7. Console.Read();
  8. }

上述Lambda表达式的输入参数省略了一对小括弧,它与“(m)=>m*2”Lambda表达式是等效的。这里还包含另外一个C#的语法糖,由于方法体中只有一句话,所以,可以省略{},甚至省略了return,实际上,上述代码的全部写法应该是:

  1. public static void Main(string[] args)
  2. {
  3. Func<int, int> func = new Func<int, int>((m) =>{ return m * ; });
  4.  
  5. Console.WriteLine(func.Invoke());
  6.  
  7. Console.Read();
  8. }

示例3:

  1. public static void Main(string[] args)
  2. {
  3. Action<int, int> action = new Action<int, int>((m,n)=> {
  4. int result = m * n;
  5. Console.WriteLine(result);
  6. });
  7.  
  8. action.Invoke(, );
  9.  
  10. Console.Read();
  11. }

上述代码中左边是两个参数,m\n,方法体中是计算m*n的结果,然后打印出来,由于方法体中是多行,因此,不能省略{}

总结:

  1. .(x, y) => x * y //多参数,隐式类型=> 表达式
  2. .x => x * //单参数, 隐式类型=>表达式
  3. .x => { return x * ; } //单参数,隐式类型=>语句块
  4. .(int x) => x * //单参数,显式类型=>表达式
  5. .(int x) => { return x * ; } //单参数,显式类型=>语句块
  6. .() => Console.WriteLine() //无参数

使用Lambda表达式,可以方便快速的编写代码,一些不复用的方法完全可以使用Lambda表达式来写,这样既提高了代码的可读性,也减少了代码量提高可维护性。

同时Lambda右边方法体内的代码块能够访问Lambda所在方法提所定义的局部变量,这样能够较少参数的定义和传递。

  1. public static void Main(string[] args)
  2. {
  3. string name = "jiming";
  4.  
  5. Func<int, int,int> func = new Func<int, int,int>((m,n)=> {
  6. int result = m * n;
  7. Console.WriteLine(result);
  8.  
  9. Console.WriteLine(name);
  10.  
  11. return result;
  12. });
  13.  
  14. func.Invoke(, );
  15.  
  16. Console.Read();
  17. }

如上述代码,name变量是定义在Main方法中的,如果不使用Lambda,使用命名方法的话,在命名方法中使用name我需要定义一个变量之后传递进入,而使用Lambda后很方便的就能够访问name变量了

阐述Lambada表达式的更多相关文章

  1. 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用

    1        打开建好的T32  Cocos2dx-3.2的一个项目 2        设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3  设置自适应窗口大小的代码是在上面的 ...

  2. lambada 表达式

    1.lambada的存在来由 匿名类的一个问题是,如果匿名类的实现非常简单,例如只包含一个方法的接口,那么匿名类的语法可能看起来不实用且不清楚.在这些情况下,您通常会尝试将功能作为参数传递给另一个方法 ...

  3. lambada表达式

    在Java 8中stream().map(),您可以将对象映射为其他对象. List<String> collect = alpha.stream().map(String::toUppe ...

  4. Lambada表达式的作用

    Lambda函数的用处   假设你设计了一个地址簿的类.现在你要提供函数查询这个地址簿,可能根据姓名查询,可能根据地址查询,还有可能两者结合.要是你为这些情况都写个函数,那么你一定就跪了.所以你应该提 ...

  5. 2.cocos2dx 3.2在语法的差异,lambada使用表达式和function和bind使用功能

    1        打开 - 内置T32  Cocos2dx-3.2一个专案 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhb ...

  6. Lambda表达式的由来

    1.lambada表达式的本质:一个匿名方法,或说是匿名委托.从C#3.0开始支持,C#2.0只支持匿名方法语法很简单 : (输入参数)=>expr   //当参数为一个是可以省略括号.lamb ...

  7. 表达式目录树(Expression)

    一:什么是表达式树 Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算.通常表达式目录树是配合Lambda一起来使用的,la ...

  8. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  9. 浅入浅出Lambda表达式

    大家在开发中会经常看到也会经常使用lambda表达式. 园子里也有很多详解lambda表达式的文章,多是从横向来讲述. 但lambda表达式到底如何变成现在这个样子,表达式的形式到底代表什么含义,这些 ...

随机推荐

  1. WPF、WinForm(C#)多线程编程并更新界面(UI)(转载积累)

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using ...

  2. ajax初学

    //参数说明url:请求文件地址//fnSucc:请求成功执行的函数,请求成功的条件为readyState状态码为4:且status状态码为200,status状态为浏览器请求返回的状态码//在fnS ...

  3. [Mugeda HTML5技术教程之7]添加动画

    前一节我们讲述了怎么在新建的作品中添加元素,元素加好以后我们还想让他们动起来,来实现比较炫的效果.这节我们将要讲述怎么给元素添加动画.Mugeda动画是通过时间轴和帧来实现的.通过在时间轴上创建图层和 ...

  4. Ajax调用返回json,xml数据类型(0517--pm)

    一.返回Json型数据: 1.主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  5. 深入浅出scanf、getcha、gets、cin函数

    转:问题描述一:(分析scanf()和getchar()读取字符) scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特殊的.但是有时候却就是因为使用这些 ...

  6. Swift--存储属性-备

    Swift中的属性分为存储属性和计算属性,存储属性就是Objective-C中的数据成员,计算属性不存储数据,但可以通过计算其他属性返回数据. 存储属性可以存储数据,分为常量属性(用关键字let定义) ...

  7. C语言中如何获得文件大小

    方法一: 获得文件大小需要用到2个函数:fseek() , ftell() fseek()函数: 原型:intfseek(FILE *stream, long offset, int fromwher ...

  8. keil C语言与汇编语言混合编程

    C与汇编混合编程主要有以下几种:(1)C语言中嵌入汇编(2)无参数传递的函数调用(3)有参数传递的函数调用 一.C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #prag ...

  9. WPF学习拾遗(二)TextBlock换行

    原文:WPF学习拾遗(二)TextBlock换行 下午在帮组里的同事解决一个小问题,为了以后方便,把就把它收集一下吧. 新建一个TextBlock作为最基础的一个控件,他所携带的功能相对于其他的控件要 ...

  10. Visio 下载,及密钥

    Visio2010简体中文高级版(永久激活密钥:GR24B-GC2XY-KRXRG-2TRJJ-4X7DC) ed2k://|file|cn_visio_2010_x64_516562.exe|515 ...