C#中的Lambda表达式‌

在C#中,‌Lambda表达式‌是一种比匿名方法更简洁、更灵活的语法形式,用于定义匿名函数(Anonymous Function)。它通过=>运算符实现,能够大幅简化委托和表达式树的编写,是现代C#编程中广泛使用的核心特性之一。


核心概念‌

1、何时引入‌: C# 3.0 中引入,作为匿名方法的进化版本。
2‌、用途‌:

  • 快速定义委托实例(如Func、Action)。
  • 构建表达式树(Expression Trees),支持LINQ查询等高级场景。
  • 简化事件处理、异步编程和集合操作。

3‌、特点‌:

  • 语法极度简洁,支持隐式类型推断。
  • 可捕获外部变量(闭包),与匿名方法行为一致。
  • 支持两种形式:‌表达式Lambda‌(单行返回值)和‌语句Lambda‌(多行代码块)。

基本语法‌

1. 表达式Lambda(Expression Lambda)

(参数列表) => 表达式

单行代码,自动返回表达式结果。
‌示例‌:

Func<int, int> square = x => x * x;
Console.WriteLine(square(5));  // 输出:25

2. 语句Lambda(Statement Lambda)

(参数列表) => {// 多行代码块return;  // 显式返回(如需)
}

需使用{}包裹代码块,显式使用return。
‌示例‌:

Action<string> log = message => {Console.WriteLine($"[{DateTime.Now}] {message}");
};
log("Hello");  // 输出带时间戳的消息

‌示例代码‌

示例1:基本委托

// 使用内置的Func委托
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(2, 3));  // 输出:5// 显式指定参数类型(当类型推断不明确时)
Func<double, double, double> power = (double x, double y) => Math.Pow(x, y);

示例2:LINQ查询

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);  // 过滤偶数
foreach (var num in evenNumbers) Console.WriteLine(num);  // 输出2,4

示例3:闭包与外部变量

int factor = 3;
Func<int, int> multiply = x => x * factor;
Console.WriteLine(multiply(5));  // 输出:15factor = 10;  // 闭包捕获变量的最新值
Console.WriteLine(multiply(5));  // 输出:50

示例4:表达式树(高级用法)

// 将Lambda转换为表达式树(而非委托)
Expression<Func<int, int, int>> expr = (a, b) => a * b + 2;
var compiledExpr = expr.Compile();
Console.WriteLine(compiledExpr(3, 4));  // 输出:14 (3*4+2)

‌Lambda表达式 vs 匿名方法‌

‌特性‌‌ Lambda表达式‌‌ ‌匿名方法‌
‌语法‌‌ 使用 => 运算符‌使用 delegate 关键字
‌参数类型推断‌完全支持(无需显式声明类型)需显式声明或依赖上下文推断
‌返回值‌表达式Lambda自动返回,语句Lambda需显式return必须显式使用return
‌表达式树支持‌是(通过Expression)
‌代码简洁性‌更简洁较冗长
‌适用场景‌现代C#代码、LINQ、异步编程旧版代码(C# 2.0)、需要显式类型声明

‌高级用法与注意事项‌

1、闭包陷阱‌:
Lambda表达式捕获外部变量时,与匿名方法共享相同的闭包行为。在循环中直接使用循环变量可能导致意外结果:

var actions = new List<Action>();
for (int i = 0; i < 3; i++) {actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions) action();  // 输出3次3,而非0,1,2

解决方法‌:在循环内创建临时变量:

for (int i = 0; i < 3; i++) {int temp = i;actions.Add(() => Console.WriteLine(temp));  // 输出0,1,2
}

2、性能优化‌:

  • 频繁调用的Lambda会导致重复的委托分配。可使用静态Lambda(C# 9.0+)减少内存开销:
Func<int, int> square = static x => x * x;  // 不捕获外部变量
  • 避免在热路径(高频执行代码)中滥用闭包。

3、与泛型方法配合‌:
Lambda表达式可自动推断泛型类型参数:

T Process<T>(T input, Func<T, T> transformer) => transformer(input);
var result = Process(10, x => x * 2);  // 自动推断T为int

4‌、异步Lambda‌:
Lambda表达式支持async/await语法:

Func<Task> asyncTask = async () => {await Task.Delay(1000);Console.WriteLine("Async completed");
};

‌何时使用Lambda表达式?‌

1‌、优先使用Lambda‌:

  • 需要简洁的委托定义(如LINQ查询、事件处理)。
  • 构建表达式树(如Entity Framework查询转换)。
  • 使用现代C#特性(如异步编程、模式匹配)。
    2‌、选择匿名方法‌:
  • 维护旧版C#(< 3.0)代码。
  • 需要显式指定参数类型且类型推断不明确时。

总结‌

Lambda表达式是C#函数式编程的核心工具,通过极简语法和强大功能,显著提升了代码的可读性和灵活性。结合闭包、表达式树和类型推断,它在LINQ、异步操作和高效集合处理中不可或缺。理解其底层机制(如委托分配、闭包行为)和性能影响,有助于编写更健壮、高效的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通信系统的性能指标

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通信系统的性能指标概述二、数字通信系统的有效性指标三、数字通信系统的可靠性指标总结 前言 一、通信系统的性能指标概述 其中一个提高&#xff0c;另一个…

Linux:(模拟HTTP协议,GET和POST方法,Http的状态码)

目录 一、认识HTTP协议 1.上网的本质 2.应用层的运行逻辑 3.HTTP的概念 二、url 1.认识网址 三、HTTP协议的宏观理解 1.HTTP请求 2.HTTP响应 3.实际的HTTP请求 &#xff08;1&#xff09;测试代码 &#xff08;2&#xff09;接收HTTP请求 &#xff08;3&#xff09…

动态规划之完全背包

引言&#xff1a; 完全背包 隶属于动态规划中的背包问题。而 01背包 又是完全背包的基石&#xff0c;所以不懂01背包的&#xff0c;有必要了解一下。 什么是完全背包&#xff1f; 01背包问题&#xff1a;有一个背包承重为V&#xff0c;有N个物品&#xff0c;每个物品的价值(…

Codeforces Round 1003 (Div. 4)

ABCDE略 F 如果这个序列有两个一样的数挨着或者中间只隔一个其他的数&#xff0c;那么这个数就是多数。可以用反证法&#xff0c;构造一个多值序列无法不包含以上两种结构。只需要在树上找这两种结构就可以了 #include <bits/stdc.h> #define int long long using nam…

金融数据分析(MATLAB)个人学习笔记(5):金融实证分析实例

一、国内外常用金融数据库简介 &#xff08;一&#xff09;国外数据库 1. CRSP数据库 CRSP&#xff08;Center for Research in Security Prices,证券价格研究中心&#xff09;是美国芝加哥大学商研所金融研究中心的产品。收集的美国股票和指数数据来源主要为纽约证券交易所…

硬件基础(3):三极管(4):关于三极管的压降

文章目录 三极管的压降使用与测量注意事项 三极管的压降 三极管的“压降”通常是指在一定工作状态下&#xff0c;三极管不同电极之间产生的电压差。对于常见的双极性晶体管&#xff08;BJT&#xff09;而言&#xff0c;最常讨论的压降通常包括以下几个部分&#xff1a; 基-发射…

[深度学习]图像分类项目-食物分类

图像分类项目-食物分类(监督学习和半监督学习) 文章目录 图像分类项目-食物分类(监督学习和半监督学习)项目介绍数据处理设定随机种子读取文件内容图像增广定义Dataset类 模型定义迁移学习 定义超参Adam和AdamW 训练过程半监督学习定义Dataset类模型定义定义超参训练过程 项目介…

5.go切片和map

切片的概念 数组和切片相比较切片的长度是不固定的&#xff0c;可以追加元素&#xff0c;在追加时可能会使切片的容量增大&#xff0c;所以可以将切片理解成 "动态数组"&#xff0c;但是&#xff0c;它不是数组&#xff0c;而是构建在数组基础上的更高级的数据结构。…

在 Windows 上安装 PowerShell 的多种方法与完整指南

原文&#xff1a;在 Windows 上安装 PowerShell 的多种方法与完整指南 | w3cschool笔记 在 Windows 上安装 PowerShell 有多种方式。每种安装方法都适用于不同的场景和工作流。请选择最适合您需求的方法。 WinGet&#xff1a;推荐在 Windows 客户端上安装 PowerShell 的方式MS…

云原生算力引擎:分布式推理的流体动力学

引言&#xff1a;算力黑洞的引力扰动 OpenAI推理集群日处理4.5亿次请求&#xff0c;CUDA 12.3实现μs级张量切换。特斯拉Dojo超算芯片间延迟0.5ns&#xff0c;阿里巴巴PAI平台节省58%训练时长。HuggingFace模型库下载量突破3亿次&#xff0c;AWS Inferentia芯片能效比提升8倍。…

MySQL MVCC的快照读和当前读区别,Redis的RDB+AOF混合持久化流程。

MySQL MVCC 的快照读和当前读区别 快照读 (Snapshot Read) 定义: 读取数据的历史版本&#xff08;快照&#xff09;&#xff0c;基于 MVCC&#xff08;多版本并发控制&#xff09;实现。特点: 不加锁&#xff0c;非阻塞读。返回事务开始时的快照数据&#xff0c;确保一致性。…

Cesium 自定义路径导航材质

cesium 自定义路径导航纹理图片随便更换&#xff0c;UI 提供设计图片即可达到效果&#xff1b; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;

3月25号

添加图片的一些例子: // 创建一个二维数组,用来管理数据int[][] data new int[4][4]; // 记录空白方块的位置int x0;int y0; // 定义一个变量,记录当前展示图片的路径String path"E:\\java\\jigsawgame\\路飞\\路飞"; // 加载图片细节: // …

【机器学习】什么是支持向量机?

什么是支持向量机&#xff1f; 支持向量机&#xff08;SVM&#xff0c;Support Vector Machine&#xff09;是一种强大的机器学习算法&#xff0c;常用于分类问题&#xff0c;也可以用于回归问题。它的核心思想是通过找到一个最佳的“超平面”来将不同类别的数据分开&#xff…

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

文章目录 一、引言云计算平台概览ToDesk云电脑&#xff1a;随时随地用上高性能电脑 二 .云电脑初体验DeekSeek介绍版本参数与特点任务类型表现 1、ToDesk云电脑2、顺网云电脑3、海马云电脑 三、DeekSeek本地化实操和AIGC应用1. ToDesk云电脑2. 海马云电脑3、顺网云电脑 四、结语…

Spring Boot 一个接口实现任意表的 Excel 导入导出

Java的web开发需要excel的导入导出工具&#xff0c;所以需要一定的工具类实现&#xff0c;如果是使用easypoi、Hutool导入导出excel&#xff0c;会非常的损耗内存&#xff0c;因此可以尝试使用easyexcel解决大数据量的数据的导入导出&#xff0c;且可以通过Java8的函数式编程解…

QT原子变量:QAtomicInteger、QAtomicPointer、QAtomicFlag

引言&#xff1a;原子变量为何重要&#xff1f; 在多线程编程中&#xff0c;共享数据的原子性访问是保证线程安全的核心。传统互斥锁虽然有效&#xff0c;但会带来性能损耗和死锁风险。QT提供的原子类型&#xff08;QAtomicInteger、QAtomicPointer、QAtomicFlag&#xff09;通…

大模型金融企业场景落地应用

一、商业银行体系 1. 江苏银行 企业背景&#xff1a;江苏银行是总部位于江苏南京的全国性股份制商业银行&#xff0c;在城商行中资产规模位居前列&#xff0c;积极拥抱金融科技&#xff0c;将数字化转型作为核心战略之一。近年来&#xff0c;江苏银行持续加大在人工智能、大数…

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列&#xff0c;其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是组合数&#xff0c;表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…

影视后期工具学习之PR(中)

pr剪辑之旅----声音设计 第五课 镜头语言和绿幕抠像 超级键效果(超级键通过简单的吸管取色和参数调整,即可实现专业级抠像与合成效果。无论是绿幕替换背景,还是创意双重曝光,都能轻松驾驭。建议结合「Alpha 通道」视图观察透明区域,逐步优化细节,最终导出高质量视频。)…