C# 匿名函数与Lambda表达式

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正

1.匿名函数 

在 C# 中,匿名函数是一种没有名称的函数,可以直接在代码中定义和使用

匿名函数主要有两种形式:匿名方法和Lambda 表达式

它们通常用于简化代码,特别是在需要短小函数的地方,如回调函数或内联函数

1.1匿名函数的声明与调用

首先,必须要需要清楚的一点是:匿名函数不要脱离委托和事件来使用

所以,先声明一个委托:


//一个无参无返回值的委托函数
delegate void D();

再声明一个匿名函数:

delegate () {Console.WriteLine("这是一个委托函数");
};

然后添加到委托中:

你可以参考这篇文章,  C# 委托-CSDN博客

通过创建实例的方式去添加匿名函数,即 "new"

D d = new D(delegate () {Console.WriteLine("这是一个委托函数");
});

 

 也可以直接等于一个匿名函数,即“=”

D d = delegate () {Console.WriteLine("这是一个委托函数");
};

 有点茴香豆的茴有五种写法的感觉了哈哈

1.2 匿名函数有参数

首先,你可以知道c#自定义的一些泛型委托,这样可以更好的使用匿名函数

当匿名函数有参数时,可以直接在声明的括号中定义参数

Action<int,int> action =delegate (int x, int y) {Console.WriteLine(x*y);
};
action(1, 5);

1.3 匿名函数有返回值

还是,你可以知道c#自定义的一些泛型委托,这样可以更好的使用匿名函数

匿名函数的返回值直接return就可以了,编译器会自动判断,委托函数考虑的就很多了

Func<int, int> func = delegate (int x) {return x;
};
func.Invoke(1);

再举个例子:

1.4 匿名函数的缺点

当你的委托是多播委托时,也就是一个委托添加了多个匿名函数时,当需要删除一些函数的时候就乱了套了,没有名字怎么找?没法找!

2.Lambda表达式

Lambda和匿名函数可以看作是同一个东西,只是声明上更加简洁

ps:lambda表达式不是正则表达式,因为我看到有人不知道从哪里听来的还犟

2.1 无参无返回值的Lambda表达式

Action action = () => {Console.WriteLine("这是一个Lambda表达式的");  
};

 

可以理解为把delegate简化成了=>并且放在了括号后面

2.2 有参数

Action<int> action1 = (int a) => {Console.WriteLine(a);
};

2.3 有返回值

Func<int, string> func = (int a) => {return "123";
};

2.4 闭包

闭包是指一个函数和它的外部环境(变量)一起被捕获的情况

即使这个函数在定义它的作用域之外被调用,它仍然可以访问和修改这些外部变量

举个栗子:

如果我有一段代码是这么写的,返回值number是重复的,因为我每次调用都会释放掉中间变量count的内存

毫不意外,的结果

 

但是如果我想要保留count从而使得最终nmber递增,可以这么写: 

Func<int, Func<int>> makeCounter = (int C) => {int count = C;return () => ++count;
};var number = makeCounter(0);//该委托是有返回值的,所以可以用一个var变量去接收
Console.WriteLine(number()); //第一次调用
Console.WriteLine(number()); //第二次调用

得到的结果:

 

Q:为什么number()是一个方法?

A:因为我返回值是一个委托,而委托可以被函数装载

Q:“Var”是什么?

A:var 是 C# 中的隐式类型局部变量声明,它允许编译器根据右侧的初始化表达式自动推断变量的类型,使用 var 可以使代码更简洁,但也需要注意可读性

Q:为什么用“Var”

A:不用声明一个相对应参数的函数

Q:为什么结果递增了?

A:虽然number变量是在makeCounter函数内部定义的,但由于lambda表达式捕获了这个变量

所以即使在makeCounter函数执行完毕后,number变量仍然存在并且可以被访问和修改

图示流程: 

 

 闭包说白了就是可以利用lambda表达式的特性,抓住中间变量,从而不释放掉其内存

使得其变量值保留下来

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487567.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Modbus转EtherCAT网关将Modbus协议的数据格式转换为EtherCAT协议

随着工业自动化技术的快速发展&#xff0c;不同通信协议之间的互操作性变得越来越重要。Modbus作为一种广泛使用的串行通信协议&#xff0c;与以太网为基础的EtherCAT协议之间的转换需求日益增长。本文将从网关功能、硬件设计、性能以及应用案例来介绍这款Modbus转EtherCAT网关…

TinaLinux ssh 环境搭建

adb shell passwd root #修改密码 vim /etc/ssh/sshd_config #编辑SSH配置文件/etc/ssh/sshd_config&#xff0c;根据需要配置如端口、允许登录的用户等 切换为英文输入法输入i&#xff0c;将下面PermitRootLogin和PasswordAuthentication改成yes PermitRootLogin yes…

华媒舍:6个媒体宣发套餐,快速突破传播界限

在当今信息爆炸的社会中&#xff0c;有效地传播自己的信息变得愈发困难。特别是对于媒体宣发来说&#xff0c;如何在市场竞争激烈的情况下突破传播界限&#xff0c;让自己的消息传达给更多的人&#xff0c;这是每个企业和个人都面临的难题。 为了解决这个问题&#xff0c;我们推…

MSPM0GXX单片机内部比较器深度解析

目录 0 前言1 简介1.1单片机简介1.2 比较器简介 2 比较器运行原理2.1 比较器配置2.2 比较器通道选择2.3 比较器输出2.4 输出滤波器2.5 采样输出模式2.6 消隐模式2.7 基准电压发生器2.8 窗口比较器模式2.9 比较器滞后 3 比较器的优势 0 前言 本文仅以TI公司生产的MSPM0GXX单片机…

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…

【Django】 读取excel文件并在前端以网页形式显示-安装使用Pandas

文章目录 安装pandas写views写urls安装openpyxl重新调试 安装pandas Pandas是一个基于NumPy的Python数据分析库&#xff0c;可以从各种文件格式如CSV、JSON、SQL、Excel等导入数据&#xff0c;并支持多种数据运算操作&#xff0c;如归并、再成形、选择等。 更换pip源 pip co…

Word 导入导出

在实际的开发过程中&#xff0c;也会遇到导入导出的功能&#xff0c;今天就简单的做一下总结。 1.需求&#xff1a;将下面word 数据导入到数据库并进行存储 在Controller中 RequestMapping(value "/ImportWord")public RawResponseBodyObject ImportWord(HttpServl…

VBA技术资料MF178:将某个文件夹中的图片导入Word

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

基于微信小程序图书馆座位预约管理系统设计与实现

1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及各种计算机硬件的完善和升级&#x…

开源模型也能强过闭源?Llama 3.1-405B数值对标GPT4!

Llama 3.1-405B引起AI浪潮&#xff1a;开源模型也能强过闭源&#xff1f; Llama 3.1 就这几天&#xff0c;只要你有在关注AI相关的事&#xff0c;你就会看见一群人在讨论 Meta 新出的 Llama 3.1。外网无数的业内大佬都在为之疯狂&#xff0c;因为 Llama3.1-405B 成为了目前开源…

CefSharp音视频编译与免费下载

注&#xff1a;Cefharp 音频和视频播放编译&#xff0c;生成相应的dll文件&#xff0c;从而支持项目开发。 建议编译至少 16G 的 RAM和至少 250G 的 SSD。该脚本以 E 盘为例&#xff0c;您需要在 E 盘上手动创建 cef 文件夹。禁止在转载后通过发布其他平台向用户收取下载费用。…

JavaEE - Spring Boot 简介

1.Maven 1.1 什么是Maven 翻译过来就是: Maven是⼀个项⽬管理⼯具。基于POM(Project Object Model,项⽬对象模型)的概念&#xff0c;Maven可以通 过⼀⼩段描述信息来管理项⽬的构建&#xff0c;报告和⽂档的项⽬管理⼯具软件。 可以理解为&#xff1a;Maven是一个项目管理工具…

MFC与QT中禁用Esc、Alt+F4、关闭图标

在业务中&#xff0c;我们需要按指定的方式才能关闭当前对话框。如下图需输入密码点击确认后&#xff0c;界面才能关闭。 1.禁用关闭按钮 在对话框初始化部分添加将关闭按钮禁用 //MFC CMenu *pSysMenu GetSystemMenu(FALSE); ASSERT(pSysMenu ! NULL); pSysMenu->EnableM…

【BUG】已解决:NameError: name ‘python‘ is not defined

NameError: name ‘python‘ is not defined 目录 NameError: name ‘python‘ is not defined 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…

学习记录——day18 数据结构 树

树的存储 1、顺序存储 对于普通的二叉树&#xff0c;不适合存储普通的二叉树顶序存储&#xff0c;一般用于存储完全二叉树而言&#xff0c;如果使用顺序存储&#xff0c;会浪费大量的存储空间&#xff0c;因为需要给没有节点的位置留出空间&#xff0c;以便于后期的插入。 所以…

图书管理系统设计

设计一个图书管理系统时&#xff0c;我们需要考虑系统的基本功能、用户需求、技术选型以及数据的安全性和完整性。下面是一个基本的图书管理系统的设计概览&#xff1a; 1. 系统目标 管理图书信息&#xff1a;添加、删除、修改图书信息。借阅管理&#xff1a;处理借书、还书流…

Leetcode—297. 二叉树的序列化与反序列化【困难】

2024每日刷题&#xff08;148&#xff09; Leetcode—297. 二叉树的序列化与反序列化 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(…

Oracle对比两表数据的不一致

MINUS 基本语法如下 [SQL 语句 1] MINUS [SQL 语句 2];举个例子&#xff1a; select 1 from dual minus select 2 from dual--运行结果 1-------------------------------- select 2 from dual minus select 1 from dual--运行结果 2所以&#xff0c;如果想找所有不一致的&a…

汽车免拆诊断案例 | 2018 款别克阅朗车蓄电池偶尔亏电

故障现象 一辆2018款别克阅朗车&#xff0c;搭载LI6发动机和GF6变速器&#xff0c;累计行驶里程约为9.6万km。车主反映&#xff0c;该车停放一晚后&#xff0c;蓄电池偶尔亏电。 故障诊断 接车后用虹科Pico汽车示波器和高精度电流钳&#xff08;30 A&#xff09;测量该车的寄…

4、Python+MySQL+Flask的文件管理系统【附源码,运行简单】

4、PythonMySQLFlask的文件管理系统【附源码&#xff0c;运行简单】 总览 1、《文件管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 注册2.3 个人中心界面2.4 文件上传界面2.5 其他功能贴图 3、下载 总览 自己做的项目&#xff0c;禁止转载&#xff0c…