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

相关推荐
机器学习之心1 小时前
小龙虾优化算法(COA)驱动的CNN-LSTM多输出回归模型及其SHAP可解释性分析
算法·cnn·lstm·小龙虾优化算法·cnn-lstm多输出回归·shap可解释性分析
阿正的梦工坊1 小时前
【Rust】13-Trait 系统、动态分发与对象安全
算法·安全·rust
言存2 小时前
力扣热题283 移动零
数据结构·算法·leetcode
字节高级特工2 小时前
智能指针原理与使用场景全解析
开发语言·c++·算法
珊瑚里的鱼2 小时前
【动态规划】买卖股票的最佳时机Ⅲ
算法·动态规划
逻辑星辰2 小时前
x-ds-pow-response逆向分析
开发语言·人工智能·python·深度学习·算法
CQU_JIAKE2 小时前
6.9【aAAA]
算法
Lewiis2 小时前
白话桶排序
数据结构·算法·golang·排序算法
非生而知之者2 小时前
基于灰狼算法优化的电量预测
python·算法·群体智能算法·电力预测