一、Lambda 表达式

1. 概念 Lambda 表达式是一种匿名函数(无名称的函数),简化了委托和匿名方法的写法,格式为: (参数列表) => 表达式或语句块 它可以作为参数传递,或赋值给委托类型变量。

2. 基本语法与简写规则

形式说明示例
完整形式带参数类型、大括号和 return(int a, int b) => { return a + b; }
省略参数类型编译器自动推断参数类型(a, b) => { return a + b; }
单参数省略括号只有一个参数时,可省略()a => { return a * 2; }
单表达式省略大括号函数体只有一句表达式时,省略{}returna => a * 2(自动返回结果)

3. 应用场景

  • 作为委托参数传递(如集合查询、事件处理)

  • 简化匿名方法的编写

  • 配合Func/Action等内置委托使用

示例:集合查询

int[] numbers = { 19, 20, 3, 18, 30 };
// 查找第一个偶数(使用Lambda作为查询条件)
int firstEven = Array.Find(numbers, v => v % 2 == 0); 

4. 与托的关联 Lambda 表达式需赋值给委托类型变量(如Func/Action)才能调用:

// Func<参数类型, 返回值类型>:带返回值的委托
Func<int, int, int> add = (a, b) => a + b;
int result = add(2, 3); // 结果:5
​
// Action<参数类型>:无返回值的委托
Action<string> print = msg => Console.WriteLine(msg);
print("Hello Lambda"); // 输出:Hello Lambda
二、事件(Event)

1. 概念 事件是一种特殊的多播委托,用于实现发布 - 订阅模式,允许对象在特定行为发生时通知其他对象。

  • 发布者:定义事件并触发它的类

  • 订阅者:注册事件并提供处理方法的类

2. 核心特性

  • 基于委托实现,通常使用EventHandlerEventHandler<TEventArgs>

  • 只能在声明它的类内部触发(调用Invoke

  • 外部只能通过+=(订阅)和-=(取消订阅)操作

  • 本质是 “安全的委托”,防止外部随意修改或触发

3. 基本用法

步骤代码示例
定义事件public event EventHandler MyEvent;
订阅事件MyEvent += EventHandlerMethod;(可绑定命名方法、匿名委托或 Lambda)
触发事件MyEvent?.Invoke(sender, e);(需先检查是否有订阅者)

4. 事件处理程序的签名 必须与事件委托的签名匹配(以EventHandler为例):

// 方法参数:事件源(sender)和事件数据(e)
void EventHandlerMethod(object sender, EventArgs e)
{// 处理逻辑
}

5. 多播特性 一个事件可以绑定多个处理方法,触发时按绑定顺序依次执行:

// 绑定多个处理方法
MyEvent += Method1;
MyEvent += Method2;
MyEvent += (s, e) => Console.WriteLine("Lambda处理");
​
// 触发时依次执行Method1 → Method2 → Lambda表达式
MyEvent?.Invoke(this, EventArgs.Empty);
三、Lambda 与事件的结合使用

Lambda 表达式可简化事件处理程序的绑定:

// 定义事件
public event EventHandler ButtonClick;
​
// 使用Lambda绑定事件处理
ButtonClick += (sender, e) => 
{Console.WriteLine("按钮被点击了");
};
​
// 触发事件
ButtonClick?.Invoke(this, EventArgs.Empty);

总结

  • Lambda 表达式:简化匿名函数的编写,常用于简化委托参数,配合Func/Action使用。

  • 事件:基于委托的发布 - 订阅机制,提供安全的跨对象通信,外部只能订阅 / 取消订阅,内部触发。

  • 两者结合:使用 Lambda 可快速编写事件处理逻辑,减少代码冗余。

以下是 C# 中 Lambda 表达式的常见用法和示例表格,涵盖基本语法、场景及说明:

类型语法格式示例代码说明
无参数() => 表达式() => Console.WriteLine("Hello")无输入参数,执行单一表达式或语句块
单参数参数 => 表达式x => x * 2单个参数可省略括号,表达式返回计算结果
多参数(参数1, 参数2) => 表达式(a, b) => a + b多个参数需用括号包裹,用逗号分隔
语句块参数 => { 语句; }n => { if (n > 0) return "正"; else return "负"; }复杂逻辑需用{}包裹,需显式使用return返回值
委托匹配与委托签名一致Func<int, bool> isEven = x => x % 2 == 0;匹配Func<int, bool>委托(输入 int,返回 bool)
事件处理简化事件订阅button.Click += (s, e) => Console.WriteLine("Clicked");替代传统的事件处理方法,简化代码
LINQ 筛选结合Where方法var adults = people.Where(p => p.Age >= 18);在 LINQ 中用于定义筛选条件,p代表集合中的每个元素
LINQ 投影结合Select方法var names = people.Select(p => p.Name);提取元素的特定属性,转换为新的序列
排序条件结合OrderBy方法var sorted = numbers.OrderBy(n => n);定义排序依据,此处按元素本身升序排序
匿名类型创建生成匿名对象people.Select(p => new { p.Name, AgeGroup = p.Age / 10 * 10 })在 LINQ 中创建匿名类型,包含指定字段(如NameAgeGroup
闭包捕获变量访问外部变量int threshold = 10; var filtered = list.Where(x => x > threshold);可访问 Lambda 表达式外部的变量(threshold),形成闭包
异步 Lambda结合async/awaitasync () => await HttpClient.GetAsync("https://example.com")async修饰,内部可使用await,返回TaskTask<T>

关键特性说明:

  1. 简洁性:相比匿名方法,语法更简洁,省略了delegate关键字和参数类型(编译器自动推断)。

  2. 类型推断:参数类型通常可省略,编译器会根据上下文(如委托类型、LINQ 方法)自动推断。

  3. 不可变性:Lambda 表达式本身是匿名函数,无法直接调用,需赋值给委托类型(如FuncAction)或作为方法参数传递。

  4. 闭包特性:能捕获并访问外部作用域的变量,变量的生命周期会被延长至 Lambda 表达式使用完毕。

  5. 适用场景:主要用于简化委托调用、事件处理、LINQ 查询、异步操作等场景,减少代码冗余。

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

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

相关文章

Springboot+Layui英语单词学习系统的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBootLayUI框架持久层框架MyBaits成功系统案例&#xff1a;参考代码数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输…

主要分布于内侧内嗅皮层的层Ⅲ的边界向量细胞(BVCs)对NLP中的深层语义分析的积极影响和启示

边界向量细胞&#xff08;Boundary Vector Cells, BVCs&#xff09;主要分布于内侧内嗅皮层&#xff08;MEC&#xff09;层Ⅲ&#xff0c;通过编码环境边界&#xff08;如墙壁、障碍物&#xff09;的距离和方向信息&#xff0c;为空间导航提供几何参考框架。这一神经机制对自然…

Selenium是解决了什么问题的技术?

Selenium 是一种用于自动化浏览器操作的技术&#xff0c;主要解决了以下问题&#xff1a;1. 自动化测试 Selenium 最初是为了解决 Web 应用程序的自动化测试 问题而设计的。它可以帮助开发者和测试人员&#xff1a; 模拟用户操作&#xff1a;如点击按钮、填写表单、选择下拉菜单…

JavaSE知识点(2)

目录 访问修饰符的区别 this关键字的作用 抽象类和接口有什么区别 抽象类可以定义构造方法吗 但是接口不可以定义构造方法 Java支持多继承吗 接口可以多继承吗 继承和抽象的区别&#xff1f; 抽象类和普通类的区别 成员变量和局部变量的区别&#xff1f; staic关键字…

(实用教程)Linux操作系统(二)

centos配置静态ip 注意&#xff1a; 1.系统中的网关要与虚拟机编辑器中的网关保持一致 2.如果配置虚拟机编辑器后发现ping不通外网的时候&#xff0c;就要还原默认设置再进行配置 总结&#xff1a; 虚拟机编辑器需要配置ip&#xff0c;网关&#xff0c;其中ip网段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例实现

ThinkPHP8集成RabbitMQ的完整案例实现一、安装依赖&#xff1a;需通过Composer安装php-amqplib库‌二、配置RabbitMQ三、生产者1、发送一个邮件&#xff0c;将任务发送到RabbitMQ队列中。2、运行结果展示四、启动消费者&#xff1a;命令行执行php think rabbitmq:consumer1&…

解密负载均衡:如何轻松提升业务性能

什么是负载均衡 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&#xff0c;从而提高了 公司业务的…

mac neo4j install verifcation

本文使用conda环境安装&#xff0c;neo4j所依赖jdk也采用conda install的方式安装。 1 neo4j下载 点击如下链接&#xff0c;选择community, Linux/Mac Executor&#xff0c;点击Download Community。 本文下载的安装包是 neo4j-community-2025.06.2-unix.tar.gz 2 安装neo4j …

【Oracle】Oracle分区表“排雷“指南:当ORA-14400错误找上门时如何优雅应对

引言&#xff1a;分区表里的"定时炸弹"凌晨三点的机房&#xff0c;你盯着屏幕上刺眼的ORA-14400: 插入的分区键值超出所有分区范围错误&#xff0c;后背发凉。这个错误就像埋在分区表里的定时炸弹&#xff0c;一旦触发就会让整个应用瘫痪。但别慌&#xff01;本文将带…

设计模式(十四)行为型:职责链模式详解

设计模式&#xff08;十四&#xff09;行为型&#xff1a;职责链模式详解职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是 GoF 23 种设计模式中的行为型模式之一&#xff0c;其核心价值在于将多个处理对象&#xff08;处理器&#xff09;连接成一条链&am…

WAIC 2025 热点解读:如何构建 AI 时代的“视频神经中枢”?

一、&#x1f310; WAIC 2025 大会看点&#xff1a;AI 正在“长出眼睛与身体” 在 2025 年的人工智能大会&#xff08;WAIC 2025&#xff09;上&#xff0c;“大模型退幕后&#xff0c;具身智能登场”成为最具共识的趋势转向。从展区到主论坛&#xff0c;再到各大企业发布的新…

OpenCV+Python

安装 OpenCV&#xff1a; Python&#xff1a;直接 pip install opencv-python&#xff08;核心库&#xff09;和 opencv-contrib-python&#xff08;扩展功能&#xff09;。 pip install opencv-python pip install opencv-contrib-python 验证安装&#xff1a; import cv2…

现代C++的一般编程规范

一般情况下不要使用std::endl&#xff0c;尤其是在循环中&#xff0c;因为可能一开始你只是想要打印一个换行符&#xff0c;但是"endl"做的更多&#xff0c;其还会刷新缓冲区&#xff0c;这会额外花费很多时间&#xff0c;相反&#xff0c;只需要使用“\n"&…

38.安卓逆向2-frida hook技术-过firda检测(三)(通过SO文件过检测原理)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

创建属于自己的github Page主页

安装手册 安装手册 环境要求 Node.js version 18.0 安装 Node.js 时&#xff0c;建议勾选所有和依赖相关的选项。 安装步骤 安装 Docusaurus 最简单的方法是使用 create-docusaurus 命令行工具&#xff0c;它可以帮助你快速搭建一个 Docusaurus 网站的基础框架。 你可以在…

Unity Catalog与Apache Iceberg如何重塑Data+AI时代的企业数据架构

在2025年DataAI Summit上&#xff0c;Databricks发布了一系列重大更新&#xff0c;标志着企业数据治理进入新阶段。其中&#xff0c;Unity Catalog的增强功能和对Apache Iceberg的全面支持尤为引人注目。这些更新不仅强化了跨平台数据管理能力&#xff0c;还推动了开放数据生态…

雨季,汽车经常跑山区,该如何保养?

雨季来临&#xff0c;山区道路变得湿滑难行&#xff0c;频繁穿梭于此的汽车面临着前所未有的挑战。如何在这样恶劣的环境中确保爱车安然无恙&#xff1f;本文将为你详细解析雨季经常跑山区的汽车该如何保养&#xff0c;让你在遭遇突发状况时也能从容应对。当雨季遇上山区路况&a…

Spring Boot音乐服务器项目-查询音乐模块

一、项目架构概览 该音乐播放服务器采用经典的MVC分层架构&#xff0c;核心模块包括&#xff1a; 实体层&#xff1a;定义数据模型Mapper层&#xff1a;数据库操作接口Controller层&#xff1a;HTTP请求处理工具层&#xff1a;加密、响应封装等辅助功能 项目核心功能包括用户…

Imagine:高效免费的图片压缩工具

很多时候&#xff0c;我们需要对图片进行压缩&#xff0c;却苦于找不到免费又好用的工具。这里给大家推荐一款电脑端的图片压缩软件——Imagine。 Imagine文末获取 它有诸多优点&#xff1a; 开源免费&#xff1a;无需担心付费问题&#xff0c;完全免费使用。 便捷易用&#…

《Uniapp-Vue 3-TS 实战开发》自定义年月日时分秒picker组件

目前组件: 组件完整代码: <template><view><picker mode="multiSelector" :value="multiIndex" :range="multiRange" @change="onMultiChange"><view class="picker">{{ formattedDateTime }}&l…