15.CSharp和Unity自带委托的区别
15.1 题目
C# 中的 Action 和 Func 是什么?Unity 中的 UnityAction 是什么?它们有什么区别?
15.2 深入解析
Action 和 Func
Action 和 Func 是 C# 中 System 命名空间下的预定义委托类型。
Action:
- Action 本身是一个无参数且无返回值的委托。
- 泛型版本的 Action<T> 可以支持最多 16 个参数,但依然没有返回值。
- 例如:
Action action = () => Console.WriteLine("Hello, Action!"); action(); Action<int, string> actionWithParameters = (number, text) => Console.WriteLine($"{number}: {text}"); actionWithParameters(1, "Hello, Action with parameters!");
Func:
- Func 本身是一个无参数但有返回值的委托。
- 泛型版本的 Func<T, TResult> 可以支持最多 16 个参数,并且最后一个类型参数表示返回值的类型。
- 例如:
Func<int> func = () => 42; Console.WriteLine(func()); Func<int, int, int> add = (a, b) => a + b; Console.WriteLine(add(1, 2));
UnityAction
UnityAction 是 UnityEngine.Events 命名空间下 Unity 提供的预定义委托类型。
- UnityAction:
- UnityAction 本身是一个无参数且无返回值的委托。
- 泛型版本的 UnityAction<T> 可以支持最多 4 个参数,且无返回值。
- 例如:
using UnityEngine; using UnityEngine.Events; public class Example : MonoBehaviour { void Start() { UnityAction action = () => Debug.Log("Hello, UnityAction!"); action(); UnityAction<int, string> actionWithParameters = (number, text) => Debug.Log($"{number}: {text}"); actionWithParameters(1, "Hello, UnityAction with parameters!"); } }
区别
命名空间:
- Action 和 Func 位于 System 命名空间。
- UnityAction 位于 UnityEngine.Events 命名空间。
参数数量:
- Action 和 Func 的泛型版本可以支持最多 16 个参数。
- UnityAction 的泛型版本可以支持最多 4 个参数。
返回值:
- Action 和 UnityAction 本身都没有返回值。
- Func 委托具有返回值。
总结
- Action 和 Func 是 C# 中的预定义委托,适用于一般的委托使用场景。
- UnityAction 是 Unity 提供的预定义委托,通常用于 Unity 事件系统中的回调函数。
- 在使用场景上,Action 和 Func 更加通用,而 UnityAction 主要用于 Unity 框架内的事件处理。
15.3 答题示例
Action 和 Func 是 C# System 命名空间下的预定义委托类型。
- Action 表示无返回值的委托,支持最多16个参数。
- Func 表示有返回值的委托,最后一个泛型参数是返回值类型,最多支持16个参数。
UnityAction 是 UnityEngine.Events 命名空间下的委托,通常用于 Unity 事件系统,支持最多4个参数,无返回值。
区别主要在于命名空间、参数个数限制及返回值:
- Action 和 UnityAction 无返回值,Func 有返回值。
- Action/Func 支持最多16个参数,UnityAction 最多4个参数。
- UnityAction 主要用于 Unity 内部事件回调,Action 和 Func 更通用。
15.4 关键词联想
- C# 委托
- Action
- Func
- UnityAction
- 事件回调
- 泛型委托
- 返回值
- UnityEngine.Events
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com