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() 空安全调用,杜绝空引用报错

相关推荐
微石科技18 小时前
长期慢病如何做好居家管理?宁波微石科技星梦云康改善周期数据零散短板
大数据·科技·物联网·算法
邪修king18 小时前
C++ 进阶终章:异常机制与智能指针全解 —— 从错误处理到 RAII 资源管理,打通现代 C++ 的核心命脉
android·数据结构·c++
微露清风18 小时前
快速排序算法学习记录
学习·算法·排序算法
梓䈑1 天前
【算法题攻略】BFS 解决FloodFill 算法、最短路问题、多源BFS 和 拓扑排序
c++·算法·宽度优先
Adios7941 天前
设置交集大小至少为2
数据结构·算法·leetcode
程序喵大人1 天前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
野生风长1 天前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
weixin_428005301 天前
C#调用 AI学习从0开始-第3阶段RAG向量数据库-文档切分与入库第15天
人工智能·学习·c#·向量数据库·rag·qdrant·文档切分与入库