目录

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 1个参数,返回void

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

总结

  1. Action 表示无返回值的方法
  2. Func 表示有返回值的方法
  3. 自定义 delegate 表示更语义化的方法类型
  4. 事件一般不用 Action/Func,而是用 EventHandler
  5. Action/Func 本质上都是 delegate