当前位置: 首页 > article >正文

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委托的相关使用。


http://www.kler.cn/a/472626.html

相关文章:

  • STM32-笔记37-吸烟室管控系统项目
  • thinkphp6.0常用设计模式实例
  • Java-数据结构-链表-高频面试题(1)
  • 【计算机操作系统:三、操作系统的用户接口】
  • 嵌入式驱动开发详解10(MISC杂项实现)
  • 数据库系统概论期末复习
  • SSM-SpringMVC-请求响应、REST、JSON
  • 基于 Nuxt3 + Obsidian 搭建个人博客
  • Synthesia技术浅析(四):自然语言处理
  • 深度学习J8周 Inception v1算法实战与解析
  • (leetcode算法题)2271. 毯子覆盖的最多白色砖块数
  • C++ 复习总结记录三
  • minibatch时,损失如何记录
  • 机器学习之随机森林算法实现和特征重要性排名可视化
  • Three.js 12中利用着色器进行材质加工深度解析
  • Backend - C# asp .net core MVC
  • 制造业该怎么做数据治理?
  • 【免费】2000-2010年各省第二产业就业人数数据
  • HarmonyOS 应用开发实践——基于 `Index` 组件的多语言、主题模式与文件存储管理
  • json报文的序列化与反序列化问题总结(对比fastjson和jackson)
  • QT鼠标、键盘事件
  • JavaAPI.02.包装类与正则表达式
  • 在vue3项目中利用自定义ref实现防抖
  • C++和Python中负数取余结果的区别
  • imageio 图片转mp4 保存mp4
  • 深度学习从入门到实战——卷积神经网络原理解析及其应用