Action、Func、Delegate 的关系
目录
delegate 是自定义武功秘籍
Action / Func 是官方已经写好的通用武功秘籍它们都是委托(delegate)的不同写法而已。
1.自定义 delegate( 自定义武功秘籍)
public delegate void Kungfu(string name, int power);可读性强,但需要自定义
2.Action:无返回值的标准武功秘籍
Action 是一种已经写好的通用 delegate,用来表示“无返回值的方法”
Action 含义
Action参数0个 返回void
Action
Action<T1, T2> 2个参数,返回void
Action<T1, T2, T3> 3个参数,返回void
注:最多16个参数
Action 打招呼 = () => Console.WriteLine("你好!");
Action<string> 叫名字 = (name) => Console.WriteLine($"你好 {name}!");
Action<string, int> 打某人 = (name, power) => Console.WriteLine($"用{power}力量打{name}");3.Func: 有返回值的标准武功秘籍
Func 专门表示有返回值的方法,最后一个泛型类型永远是返回值类型
例如:
Func<int> 给力量 = () => 999; // 返回 int
Func<string, int> 名字长度 = (name) => name.Length; // 参数 string 返回 int
Func<int, int, int> 加法 = (a, b) => a + b;4.Action / Func 与 自定义 delegate 的关系
Action 和 Func 是已经定义好的委托类型
也就是说:
public delegate void Kungfu();本质上等同于:
Action再比如:
public delegate int Calculate(int x, int y);等同于:
Func<int, int, int>5.区别
自定义 delegate = 自己写一本武功秘籍
适用于:
- 想让代码更语义化(比如 Kungfu、Attack、LogHandler)
- 想让方法更可读
- 想做事件(因为事件通常需要语义)
Action = 官方通用" 无招胜有招"的通用武功秘籍
适用于:
- 不需要返回值
- 不需要特殊名字
- 简单的方法回调
例如:
Action<string> 打招呼;Func = 官方通用"带返回值"的招式秘籍
例如 “计算伤害”、“判断是否存活”:
Func<int, int, int> 计算伤害;
Func<Player, bool> 是否死亡;6.使用场景
需要语义性(如 OnPlayerDead)➡ 用自定义 delegate
方法非常简单 ➡ 用 Action
有返回值的回调 ➡ 用 Func
LINQ 中的筛选、投影 ➡ 用 Func
并发、异步、Task 回调 ➡ 用 Func / Action
总结
- Action 表示无返回值的方法
- Func 表示有返回值的方法
- 自定义 delegate 表示更语义化的方法类型
- 事件一般不用 Action/Func,而是用 EventHandler
- Action/Func 本质上都是 delegate