在项目中我们经常会接触lambda表达式,链式操作简洁明了。帮我们省了不少事。面对这么神奇的一个东西,是不是也应该了解了解它的本质呢。

今天我们通过一步一步的演变揭开lambda表达式的本质 

一.委托

C# 中的委托类似于 C 或 C++ 中函数的指针。委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托的本质也跟类一样,是用户自定义的类型。类的定义是通过class关键字

,而委托的定义是通过delegate来定义

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //声明一个AddNum类型的变量a,
  6. AddNum a = new AddNum(Add); //创建一个指向Add方法的委托对象
  7. a(2, 3); //调用a指向的方法
  8. Console.WriteLine(a); //打印a的类型,a(2,3)加上括号才是调用
  9. Console.WriteLine(a(2, 3));
  10. }
  11. //声明一个方法以便委托调用,要注意的是方法的签名要与委托声明的签名保持一致
  12. public static int Add(int a,int b)
  13. {
  14. return a + b;
  15. }
  16. }
  17. //声明一个委托,要注意的是委托跟类是同一级别的
  18. delegate int AddNum(int a, int b);

二.匿名方法

匿名方法,顾名思义就是没有名字的方法,通常我们调用方法就是根据方法的名字进行调用,那这匿名方法没有名字我们该如何调用嘞。别着急,我们可以通过匿名方法实现委托实例来进行调用

  1.        AddNum c = new AddNum(Add); //传统的做法,先通过创建Add方法再创建委托实例
  2. //使用匿名方法创建委托实例
  3. AddNum b = delegate (int m, int n)
  4. {
  5. return m + n;
  6. };
  7. Console.WriteLine(b(6,6)); //委托的调用还是一样的

三.lambda表达式

lambda是一个匿名方法,C#中的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”

  1.      //匿名方法声明委托
  2. AddNum b = delegate (int m, int n){ return m + n; };
  3. //lambda格式的匿名方法的写法
  4. AddNum c = (int m, int n)=>{ return m + n; };
  5. //演变一:可以省略数据类型(编译器可以根据委托类型自动推断)
  6. AddNum d = (m,n) => { return m + n; };
  7. //演变二:当匿名方法只用一个参数,小括号也可以省略
  8. Func<int, bool> e = i => { return true; }; //Func为内置的委托对象,最后一个参数是返回值的类型
  9. //演变三:若委托有返回值,并且方法体只有一行代码,则大括号和return都可以省略
  10. AddNum f = (m, n) => m + n;

 

版权声明:本文为HTLucky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/HTLucky/p/13378164.html