2026.03.20
C# 委托与事件深入解析
## 委托与事件
委托(Delegate)和事件(Event)是 C# 中非常重要但也容易混淆的概念。
### 委托是什么?
委托是方法的类型安全引用。你可以把它理解为"方法的变量"。
```csharp
// 定义委托
public delegate void DamageHandler(int damage);
// 使用委托
public class Player : MonoBehaviour {
public DamageHandler OnTakeDamage;
void TakeDamage(int dmg) {
OnTakeDamage?.Invoke(dmg);
}
}
```
### 事件是什么?
事件是在委托基础上添加了一层保护,外部只能 += 和 -=,不能直接 Invoke。
```csharp
public class Player : MonoBehaviour {
public event DamageHandler OnTakeDamage; // event 关键字
void TakeDamage(int dmg) {
OnTakeDamage?.Invoke(dmg); // 只能在类内部调用
}
}
// 外部代码
player.OnTakeDamage += ShowDamageUI; // 可以
// player.OnTakeDamage.Invoke(10); // 编译错误!
```
### Action 和 Func
C# 提供了内置的泛型委托,不需要自己声明:
- `Action`:无返回值的方法
- `Action`:有参数无返回值
- `Func`:有返回值的方法
- `Func`:有参数有返回值
### 总结
委托和事件是 C# 解耦代码的利器,Unity 中的 UI 按钮点击、碰撞检测等大量使用了事件机制。