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

c#Lambda 表达式与事件核心知识点整理

一、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.dtcms.com/a/299348.html

相关文章:

  • 对比JS“上下文”与“作用域”
  • 网络资源模板--基于Android Studio 实现的简易购物App
  • 变频器实习DAY15
  • 地级市-生态韧性数据(2000-2022年)-实证数据
  • VTK交互——Callback
  • MySQL 8.0 OCP 1Z0-908 题目解析(36)
  • 【Redis】 Redis 基础命令和原理
  • 前端设计中如何在鼠标悬浮时同步修改块内样式
  • LeetCode 895:最大频率栈
  • HTML初学者第五天
  • 计算机编码
  • Linux权限机制:RUID/EUID/SUID与进程安全
  • 排序算法,咕咕咕
  • 【Zephyr】Window下的Zephyr编译和使用
  • window下MySQL安装(三)卸载mysql
  • PYTHON从入门到实践-16数据视图化展示
  • Rust Web框架性能对比与实战指南
  • 数据结构 二叉树(3)---层序遍历二叉树
  • SQLite 子查询详解
  • 告别复杂配置!Spring Boot优雅集成百度OCR的终极方案
  • C语言基础10——函数
  • Qt 与 WebService 交互开发
  • Linux学习 韦东山IMX6ULL(一)搭建环境并编译程序
  • SQL Developer Data Modeler:一款免费跨平台的数据库建模工具
  • 强化学习(第三课第三周)
  • Rust赋能土木工程数字化
  • AUTOSAR进阶图解==>AUTOSAR_SRS_TimeService
  • Raft 协议 Paxos协议 和zk协议的特点和异同
  • 【Pandas】pandas Index objects Index.shape
  • 【温度传感器】热电偶、热敏电阻、热电阻、热成像仪原理及精度解析