动态编程入门第一节:C# 反射 - Unity 开发者的超级工具箱
动态编程入门第二节:委托与事件 - Unity 开发者的高级回调与通信艺术
动态编程入门第三节:表达式树 - 运行时构建代码,释放极致性能!
上次我们聊了 C# 反射,它让程序拥有了在运行时“看清自己”的能力。但光能看清还不够,我们还需要让代码能够灵活地“沟通”和“响应”。这就不得不提到 C# 中另外两个非常重要的概念:委托 (Delegate) 和 事件 (Event)。
作为 Unity 开发者,你可能每天都在使用它们,比如 Unity UI 按钮的 OnClick 事件、SendMessage 或 GetComponent<T>().SomeMethod() 等等,它们背后或多或少都离不开委托和事件的思想。今天,我们就来深入探讨它们的进阶用法,以及它们如何构建起 Unity 中高效、解耦的回调和消息系统。
1. 委托(Delegate):方法的“引用”或“签名”
简单来说,委托是一个类型安全的函数指针。它定义了一个方法的签名(包括返回类型和参数列表),可以引用任何符合这个签名的方法。一旦委托引用了一个或多个方法,你就可以通过调用委托来执行这些被引用的方法。
1.1 委托的基础与回顾
你可能已经习惯了使用 Unity 的 UnityEvent 或者直接使用 Action 和 Func。它们都是委托的体现。
-
定义委托:
// 定义一个委托类型,它能引用一个没有参数,没有返回值的函数 public delegate void MyActionDelegate(); // 定义一个委托类型,它能引用一个接收一个int参数,返回string的函数 public delegate string MyFuncDelegate(int value); -
实例化与调用:
using UnityEngine; public class DelegateBasicExample : MonoBehaviour { public delegate void MySimpleDelegate(); // 定义委托 void Start() { MySimpleDelegate del; // 声明委托变量 // 引用一个方法 (方法签名必须与委托匹配) del = SayHello; del(); // 调用委托,等同于调用 SayHello() // 委托可以引用静态方法 del += SayGoodbye; // += 用于添加方法到委托链 (多播委托) del(); // 会依次调用 SayHello() 和 SayGoodbye() del -= SayHello; // -= 用于从委托链中移除方法 del(); // 只会调用 SayGoodbye() } void SayHello() { Debug.Log("Hello from delegate!"); } static void SayGoodbye() { Debug.Log("Goodbye from static delegate!"); } }
1.2 Action 和 Func:泛型委托的便捷性
在 C# 3.0 之后,微软引入了 Action 和 Func 这两个内置的泛型委托,极大地简化了委托的定义。
-
Action: 用于引用没有返回值的委托。Action:没有参数,没有返回值。Action<T1, T2, ...>:接收 T1, T2… 类型参数,没有返回值。- 最多支持 16 个参数。
-
Func: 用于引用有返回值的委托。Func<TResult>:没有参数,返回 TResult 类型。Func<T1, T2, ..., TResult>:接收 T1, T2… 类型参数,返回 TResult 类型。- 最多支持 16 个参数和 1 个返回值。
示例:
using System; // Action 和 Func 在 System 命名空间
using UnityEngine;
public class ActionFuncExample : MonoBehaviour
{
void Start()
{
// Action 示例
Action greetAction = () => Debug.Log("Hello using Action!");
greetAction();
Action<string> printMessage = (msg) => Debug.Log("Message: " + msg);
printMessage("This is a test.");
// Func 示例
Func<int, int, int> addFunc

最低0.47元/天 解锁文章
2013

被折叠的 条评论
为什么被折叠?



