C#核心技术---Lambda表达式

Lambda表达式简介

Lambda表达式:就是一个匿名函数,可以表示为委托的代码,或者表示为表达式树的代码,它所表示的表达式树会编译为委托。

简言之:Lambda表达式就是匿名方法的另一种表现形式,是一种高效的类似于函数式编程的表达式。

Lambda 表达式可应用于:将要执行的代码传递给异步方法、Linq扩展方法中、创建表达式树。

优点:Lambda表达式 简化了匿名委托的使用,减少开发中需要编写的代码量

匿名函数(方法):提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。
在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。

Lambda表达式演变

1.在 C# 1.0 中,通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。

delegate double Calculate(double d1,double d2);//声明一个计算的委托
//定义方法
public double Add(double a,double b)
{
    return a+b;
}
public void Test()
{
    //创建委托实例
    Calculate add=new Calculate(Add);
    double sum=add(3.5,0.5);  //7
}
  1. C# 2.0 引入了匿名方法的概念,作为一种编写可在委托调用中执行的未命名内联语句块的方式。
delegate double Calculate(double d1,double d2);//声明一个计算的委托
public void Test()
{
   Calculate subtract=delegate(double x,double y)
   {
      return x-y;
   }; //这里一定要写分号
   
   subtract(5.0,3.5);   //1.5
} 
  1. C# 3.0 引入了 Lambda 表达式,这种表达式与匿名方法的概念类似,但更具表现力并且更简练.
delegate double Calculate(double d1,double d2);//声明一个计算的委托
public void Test()
{
   Calculate multipy=(x,y)=>x*y;
   multipy(1.5,2.0); //3
} 

由上面这3步演化,从命名委托--->匿名函数--->Lambda表达式,带给我们的是编程上的优美,简洁,可读性强。

Lambda表达式语法

Lambda表达式语法:

(参数列表) => 语句或语句块

其中的”=>“ 该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。

Calculate multipy=(x,y)=>x*y;

其中的(x,y)就是参数列表,x*y 就是表达式,如果有多个语句,就右侧就是语句块,将多条语句写到{}中。

.Net自带委托

Action委托

Action委托表示引用一个返回类型为void的方法,即封装了一个无返回值的方法。这种委托有多种不同的变体,可以没有传入参数,可以最多有16个参数。

没有泛型的Action可以调用没有参数的方法。如:

Action printAct=()=>Console.WriteLine("Welcome to here!");

Action 表示有一个传入参数的方法,如:

 Action<string> printMsg = name =>
 {
     string msg = $"Welcome to here! {name}";
     Console.WriteLine(msg);
 };

Action<in T1,in T2> 表示有两个传入参数的方法,如:

 Action<string,int> printStuInfo = (name,age) =>
 {
     string msg = $"你的信息:姓名: {name} ;年龄:{age}";
     Console.WriteLine(msg);
 };

.......

以此类推。以后应用中,如果需要用不带返回值的委托,可以使用Action的各种变体形式,不需要非得去自定义委托。

Func委托

Func可以引用一个带一个返回值的方法。使用方式与Action类似,不过Func允许调用带返回值的方法。Func也有不同的变体,最多可以传递16个参数和一个返回类型。

Func可以调用一个没有传入参数,有返回值的方法,T表示返回值类型。

 Func<int> func1 = () =>
 {
     int a=5;
     return a+2;
 };

Func<in T1,out T2 >可以调用有一个传入参数,有返回值的方法,T1表示传入参数类型,T2表示返回值类型。

 Func<int,int> func2 = num=>
 {
     int re=num+5;
     return re;
 };

Func<in T1,in T2,out T3 >可以调用有两个传入参数,有返回值的方法,T1,T2表示传入参数类型,T3表示返回值类型。

 Func<int,int,int> funcAdd = (n1,n2)=>
 {
     int re=n1+n2;
     return re;
 };

......

以此类推。以后应用中,如果需要用带返回值的委托,可以使用Func委托的各种变体形式,不需要非得去自定义委托。

//定义一个封装打印消息到控制台的方法
Action<string> PrintOut=msg=>Console.WriteLine(msg);
//定义一个表达式,返回bool结果
Func<int, int, bool> pre1 = (a, b) => a > b;  

在后面的Linq扩展中,会有关于Func委托的相关使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值