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

C# 匿名方法和Lambda表达式

一.匿名方法

1.匿名方法的演变

匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础。在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建具名方法,从而用匿名方法更为方便。
下面一段代码是声明并使用了一个名称为Add20的方法(和之前的写法一样)

namespace demo1_0726
{public delegate int OtherDel(int n);//声明委托internal class Program{public static int Add20(int x){return x + 20;}static void Main(string[] args){OtherDel otherDel = new OtherDel(Add20);Console.WriteLine("{0}", otherDel(5));Console.WriteLine("{0}", otherDel(6));Console.ReadKey();}}
}

下面的一段代码使用了匿名方法来替代Add20

namespace demo2_0726
{public delegate int OtherDel(int n);//声明委托internal class Program{static void Main(string[] args){OtherDel otherDel = delegate (int x){      return x + 20; };Console.WriteLine("{0}", otherDel(5));Console.WriteLine("{0}", otherDel(6));Console.ReadKey();}}
}

2.匿名方法的使用

可以在如下地方使用匿名方法
(1)声明委托变量时作为初始化表达式
(2)组合委托时在赋值语句的右边
(3)为委托增加事件时在赋值语句的右边

3.匿名方法的语法

匿名方法表达式的语法包含如下部分:

//delegate类型关键字
//参数列表,如果语句块没有使用任何参数则可以省略
//语句块,包含了匿名方法的代码
//关键字( 参数列表) { 语句块 }
delegate (Parameters) {ImplementationCode}

1.返回类型

匿名方法不会显示声明返回值。如果委托有void类型的返回值,匿名方法就不能有返回值。

//这里委托类型的返回类型是整形
delegate int OtherDel(int InParam);
static void Main()
{
OtherDel del=delegate(int x){return x+20;//返回一个整型值};
......              
}

2.参数

除了数组参数,匿名方法的参数列表必须在以下3方面与委托匹配:
参数数量;参数类型及位置;修饰符
以下情况,我们可以使圆括号为空或省略圆括号来简化匿名方法的参数列表(两项同时成立)
1 委托的参数列表不包含任何out参数
2 匿名方法不使用任何参数
举例

namespace demo2_0726
{public delegate void OtherDel(int n);//声明委托internal class Program{static void Main(string[] args){Program program = new Program();//OtherDel otherDel = delegate (int n)//可以写全OtherDel otherDel = delegate //也可以省略括号{program.sum();program.subtract();};otherDel(5);Console.ReadKey();}void sum(){int n = 4;n += 3;}void subtract(){int n = 4;n -= 2;}}
}

3.params参数

如果声明委托的参数列表包含了params参数,那么params关键字在匿名方法的参数列表中就会被省略:

delegate void SomeDel(int X,params int[] Y)//在委托声明中使用params关键字
SomeDel mDel=delegate(int X, int[] Y)//在匹配的匿名方法中省略关键字
{
...
};

4.变量和参数的作用域

1 参数以及声明在匿名方法内部的局部变量的作用域限制在实现方法的主体之内.
2 与委托的具名方法不同,匿名方法可以访问它们外围作用域的局部变量和环境,方法中的代码可以访问外围变量并且输出它的值。

二.Lambda表达式

1.Lambda表达式简介

C#2.0引入了匿名方法,C#3.0引入了Lambda表达式,匿名方法演变成Lambda表达式,在使用中我们更希望使用Lambda表达式来替代匿名方法。

2.匿名方法转换为Lambda表达式的步骤

1 删除delegate关键字
2 在参数列表和匿名方法主体之间放lambda运算符=>。lambda运算符读作goes to

Mydel del=delegate(int x)  {return x+1;};//匿名方法
Mydel le1=        (int x)=>{return x+1;};//Lambda表达式

3.简化Lambda表达式

(1) 编译器可以从委托的声明中知道委托参数的类型,因此Lambda表达式允许我们省略类型参数。
带有类型的参数列表称为显示类型
省略类型的参数列表称为隐式类型
(2)如果只有一个隐式类型参数,我们可以省略周围的括号。
(3)Lambda表达式允许表达式的主体是语句块或者表达式。如果语句块包含了一个返回语句,我们可以将语句块替换为return关键字后的表达式(即去掉关键字return)。

Mydel del=delegate(int x)  {return x+1;};//匿名方法
Mydel le1=        (int x)=>{return x+1;};//Lambda表达式
Mydel le1=            (x)=>{return x+1;};//省略类型的Lambda表达式
Mydel le1=             x =>{return x+1;};//省略隐式类型周围的括号的Lambda表达式
Mydel le1=             x =>        x+1  ;//去掉关键字return的Lambda表达式

4.Lambda表达式的注意事项

(1) Lambda表达式参数列表中的参数必须在参数数量、类型和位置上与委托相匹配;
(2) 表达式的参数列表中的参数不一定需要包含类型(隐式类型),除非委托有ref或out参数–此时必须注明类型(显示类型)
(3) 如果只有一个隐式类型参数并且是隐式类型的,我们可以省略周围的括号。,否则必须有括号
(4) 如果没有参数,必须使用一组空的圆括号。

相关文章:

C# 匿名方法和Lambda表达式

一.匿名方法 1.匿名方法的演变 匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础。在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建具名方法&…...

uniapp微信小程序scroll-view滚动scrollLeft不准确

今天在实现微信小程序的一个横向导航的时候出现了一个问题,就是每次滑到滚动条最右边的时候 scrollLeft的值都不准确 原因:因为每次滚动监听事件都会被调用比较耗费资源系统会默认节流,可以在scroll-view 加一个 throttle“{{false}}” 关闭…...

symfony/console

github地址:GitHub - symfony/console: Eases the creation of beautiful and testable command line interfaces 文档地址:The Console Component (Symfony 5.4 Docs) 默认命令list,可以用register注册一个command命令,之后可以…...

OSI模型简介及socket,tcp,http三者之间的区别和原理

1.OSI模型简介(七层网络模型) OSI 模型(Open System Interconnection model):一个由国际标准化组织提出的概念模型,试图提供一个使各种不同的计算机和网络在世界范围内实现互联的标准框架。 它将计算机网络体系结构划分为七层,每…...

【leetcode】leetcode69 x的平方根

文章目录 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。原理牛顿法(数值分析中使用到的):二分法 解决方案java 实现实例执行结果 python 实现实例 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数&…...

springboot与rabbitmq的整合【演示5种基本交换机】

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:后端专栏 📧如果文章知识点有错误的地方,…...

【设计模式】设计原则-单一职责原则

单一职责原则 类的设计原则之单一职责原则,是最常用的类的设计的原则之一。 百度百科:就一个类而言,应该仅有一个引起它变化的原因。应该只有一个职责。 通俗的讲就是:一个类只做一件事 这个解释更通俗易懂,也更符…...

【C++】-多态的底层原理

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …...

【部署】让你的电脑多出一个磁盘来用!使用SSHFS将远程服务器目录挂载到Windows本地,挂载并共享服务器资源

让你的电脑多出一个磁盘来用!---使用SSHFS将远程服务器目录挂载到Windows本地 1. 方法原理介绍2.SSHFS-Win使用教程—实现远程服务器磁盘挂载本地 由于日常主要用 Windows 系统,每次都得 ssh 到服务器上进行取资源(本地磁盘不富裕&#xff09…...

/var/lock/subsys目录的作用

总的来说,系统关闭的过程(发出关闭信号,调用服务自身的进程)中会检查/var/lock/subsys下的文件,逐一关闭每个服务,如果某一运行的服务在/var/lock/subsys下没有相应的选项。在系统关闭的时候,会…...

DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程

目标检测系列的算法模型可以说是五花八门,不同的系列有不同的理论依据,DETR的亮点在于它是完全端到端的第一个目标检测模型,DETR(Detection Transformer)是一种基于Transformer的目标检测模型,由Facebook A…...

C++初阶 - 5.C/C++内存管理

目录 1.C/C的内存分布 2.C语言中动态内存管理方式:malloc、calloc、realloc、free 3.C内存管理方式 3.1 new/delete操作内置类型 3.2 new 和 delete操作自定义类型 4.operator new 与 operator delete 函数(重要点) 4.1 operator new 与…...

数学建模学习(3):综合评价类问题整体解析及分析步骤

一、评价类算法的简介 对物体进行评价,用具体的分值评价它们的优劣 选这两人其中之一当男朋友,你会选谁? 不同维度的权重会产生不同的结果 所以找到每个维度的权重是最核心的问题 0.25 二、评价前的数据处理 供应商ID 可靠性 指标2 指…...

【后端面经】微服务构架 (1-5) | 限流:濒临奔溃?限流守护者拯救系统于水火之中!

文章目录 一、前置知识1、什么是限流?2、限流算法A) 静态算法a) 漏桶b) 令牌桶c) 固定窗口d) 滑动窗口B) 动态算法3、限流的模式4、 限流对象4、限流后应该怎么做?二、面试环节1、面试准备2、基本思路3、亮点展现A) 突发流量(针对请求个数而言)B) 请求大小(针对请求大小而言)…...

HDFS异构存储详解

异构存储 HDFS异构存储类型什么是异构存储异构存储类型如何让HDFS知道集群中的数据存储目录是那种类型存储介质 块存储选择策略选择策略说明选择策略的命令 案例:冷热温数据异构存储对应步骤 HDFS内存存储策略支持-- LAZY PERSIST介绍执行使用 HDFS异构存储类型 冷…...

《面试1v1》Kafka消息是采用Pull还是Push模式

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…...

Windows环境Docker安装

目录 安装Docker Desktop的步骤 Docker Desktop 更新WSL WSL 的手动安装步骤 Windows PowerShell 拉取(Pull)镜像 查看已下载的镜像 输出"Hello Docker!" Docker Desktop是Docker官方提供的用于Windows的图形化桌面应用程序&#xff0c…...

Spring 6.0官方文档示例(23): singleton类型的bean和prototype类型的bean协同工作的方法(二)

使用lookup-method: 一、实体类&#xff1a; package cn.edu.tju.domain2;import java.time.LocalDateTime; import java.util.Map;public class Command {private Map<String, Object> state;public Map<String, Object> getState() {return state;}public void …...

Docker Compose 容器编排

Docker compose Docker compose 实现单机容器集群编排管理&#xff08;使用一个模板文件定义多个应用容器的启动参数和依赖关系&#xff0c;并使用docker compose来根据这个模板文件的配置来启动容器&#xff09; 通俗来说就是把之前的多条docker run启动容器命令 转换为docker…...

while循环

while循环是一种常见的循环结构&#xff0c;它会重复执行一段代码&#xff0c;直到指定的条件不再满足。 基本语法如下&#xff1a; while 条件: # 循环体代码 其中&#xff0c;条件是一个布尔表达式&#xff0c;如果为True&#xff0c;则执行循环体中的代码&#xff1b;如果…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...