C# 三大内置委托(Action / Func / Predicate)+ Lambda

一、变量作用域 & 就近原则(代码前置知识点)

1. 局部变量

  • 定义在**方法体 { }**内部

  • 生命周期:从定义开始 → 方法执行结束立即释放

  • 作用域:仅当前方法内有效

2. 全局变量(字段/属性)

  • 定义在 class 内部、方法外部

  • 整个类中所有方法都可以访问

3. 变量就近原则(核心)

局部变量和全局变量重名 时:优先使用局部变量

cs 复制代码
public static int b = 0; // 全局静态变量
static void Main(string[] args)
{
    int b = 10; // 局部变量
    Console.WriteLine(b); // 输出10,就近优先
}

二、C# 三大内置委托(必考)

不用自己手写 delegate,系统自带三种万能委托,覆盖 99% 回调场景。

1. Action 委托:无返回值

  • 只能传参数,没有返回值

  • Action:无参无返回

  • Action<T>:有参数无返回

对应你代码:Action<int> → 参数int、无返回值

2. Func 委托:必有返回值

  • 泛型最后一个类型是返回值,前面全部是参数类型

  • Func&lt;int, string&gt;:参数int,返回string

  • Func<T1,T2,TResult>:多参数 + 返回值

3. Predicate 委托:固定返回bool

  • 专门用于条件判断

  • 固定签名:参数任意类型,返回值永远是bool

  • Predicate<int>:传int,返回true/false


三、代码逐段解析:三种回调写法演变

方式1:局部匿名方法(最繁琐、原始写法)

在方法内部定义局部方法,当做委托参数传递

cs 复制代码
// F1 参数:Action<int> 无返回、int参数
F1(d1);
// 局部匿名方法
void d1(int a1)
{
    Console.WriteLine("a1的值" + a1);
}

方式2:先定义委托变量,再传递

cs 复制代码
Func<int, string> d2 = a1 => { return "ssss"; };
F2(d2);

方式3:Lambda 直接传参(最终极简写法)

不用定义变量、不用定义局部方法,一行直接回调

cs 复制代码
F3(v => true);

四、三个回调方法底层解析

1. F1 ------ Action 无返回值回调

cs 复制代码
static void F1(Action<int> action)
{
    action?.Invoke(10); // 空安全调用,传入实参10
    Console.WriteLine("F1的方法");
}

执行逻辑:调用者传入方法 → F1内部主动执行该方法(回调)

2. F2 ------ Func 带返回值回调

cs 复制代码
static void F2(Func<int, string> func)
{
    Console.WriteLine(func?.Invoke(10)); // 接收回调返回的字符串并打印
    Console.WriteLine("F2的方法");
}

3. F3 ------ Predicate 条件判断回调

cs 复制代码
static void F3(Predicate<int> pre)
{
    Console.WriteLine(pre(10)); // 接收bool结果
    Console.WriteLine("F3的方法");
}

五、Lambda表达式 化简规则(你代码的演变过程)

完整写法

cs 复制代码
a1 => { return "ssss"; };

单返回极简写法(省略大括号、return)

cs 复制代码
v => true

规则:方法体只有一行返回代码,可直接省略 { } 和 return


六、三大内置委托终极对照表(背诵)

内置委托 返回值 作用场景
Action 无返回值 void 单纯执行逻辑、无结果返回
Func 有返回值 需要回调返回数据、计算结果
Predicate 固定 bool 条件筛选、判断真假(数组、集合筛选专用)

七、满分核心总结

  • 就近原则:局部变量优先于全局变量

  • Action 干执行,无返回

  • Func 干计算,有返回

  • Predicate 干判断,返布尔

  • 写法演变:局部方法 → 委托变量 → Lambda极简一行

  • ?.Invoke() 空安全调用,杜绝空引用报错

相关推荐
吴可可1233 小时前
C#重写机制与CAD图元开发要点
c#
小小龙学IT3 小时前
simdjson:利用 SIMD 指令实现 GB/s 级 JSON 解析的 C++ 开源库
开发语言·c++·json
AndrewHZ3 小时前
【LLM技术全景】RAG 从原理到实战——检索增强生成完整指南
人工智能·深度学习·算法·llm·检索增强·生成式模型·rag
LuminousCPP3 小时前
单链表专题(三)-刷题复盘篇:从快慢指针到环形链表 II 数学推导
数据结构·经验分享·笔记·学习·算法·链表
-dzk-3 小时前
【贪心算法】LC 121.买卖股票的最佳时机
算法·贪心算法
A_nanda3 小时前
c#WPF开发常见问题
开发语言·c#·wpf
唐青枫3 小时前
别只会解析参数:C#.NET Spectre.Console.Cli 命令行工具实战详解
c#·.net
hanlin033 小时前
动态规划专练:力扣第718、1143题
算法·leetcode·动态规划
ChaoZiLL3 小时前
二叉树经典例题
数据结构·算法
不正经学生3 小时前
C语言字符串函数进阶:安全版函数 + 错误处理 + 子串查找
c语言·开发语言·c++·算法·面试