一、变量作用域 & 就近原则(代码前置知识点)
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<int, string>:参数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() 空安全调用,杜绝空引用报错