1.Lambda表达式的演化
public delegate int MydeleAdd(int x); MydeleAdd add= delegate(int x) {return x+1;};//匿名方法 MydeleAdd add= (int x) => {return x+1;};//省略delegate 使用=>(goes to) MydeleAdd add= (x) => {return x+1;};//省略类型 MydeleAdd add= x => {return x+1;};//省略圆括号 MydeleAdd add= x => x+1; //省略return
可以看到Lambda表达式是从委托开始进行一步步进化,最终版本简洁、直观、易用。
C#1.0中加入委托
C# 2.0中,匿名方法被引入作为一种创建委托实例的方式
C#3.0中加入Lambda表达式
C#中的Lambda表达式依赖以下几种主要的技术实现:
- 委托:Lambda表达式在C#中是通过委托实现的。委托是一种引用方法的类型,它可以被用来封装一个具有特定的函数签名和返回类型的方法。
- 匿名方法:在C# 2.0中引入的匿名方法是Lambda表达式的基础。匿名方法允许我们创建一个没有名字的方法体,并将其赋值给委托。
- 类型推断:C#的编译器能够根据上下文推断Lambda表达式的参数类型,这使得我们在编写Lambda表达式时不必显式地指定参数类型。
- 表达式树:在C# 3.0及其后续版本中,Lambda表达式可以被编译为表达式树,而不是直接编译为IL代码。表达式树是一种数据结构,它表示一些代码片段,这使得我们可以在运行时操作和修改这些代码片段。
- 闭包:在C#中,Lambda表达式可以捕获其作用域内的变量,这是通过闭包实现的。闭包是一种可以捕获和存储其外部作用域中的局部变量的代码结构。
2.委托的定义和示例
委托定义了一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 其参数列表和返回类型匹配的方法(静态或实例)分配给该类型的变量,然后(使用适当参数)直接调用该方法,或将其作为参数本身传递给另一方法再进行调用。
简单一句话描述就是:将方法当作参数传递的引用 类型被称为委托
using System; using System.Linq; public class Program { //定义委托 public delegate string Reverse(string s); static string staticReverseString(string s) { return new string(s.Reverse().ToArray()); } string ReverseString(string s) { return new string(s.Reverse().ToArray()); } static void Main(string[] args) { //传递静态方法 Reverse rev = staticReverseString; //传递实例化方法 Reverse rev2 = new ReverseString; Console.WriteLine(rev("a string")); Console.WriteLine(rev2("a string")); } }
3.匿名方法
很多时候委托接收的方法是一次性的或者方法体是非常简单的,匿名方法为满足此场景而诞生。顾名思义这类方法的特点是不需要去定义函数的名字
public class SampleAnonymousMethod { static void Main(string[] args) { Func<int, int, int> sum = delegate (int a, int b) { return a + b; }; Console.WriteLine(sum(11,22)); //输出:33 } }
4.Func和Action
Func和Action是匿名方法的语法糖Func是有返回值的匿名方法,Action是不具有返回值的匿名方法
正文完