C#基础:委托与事件(在Unity中举例)
委托(Delegate):
委托是C#中的一种类型,表示对具有特定参数列表和返回类型的方法的引用。委托类似于C++中的函数指针,但它是类型安全的,并且是面向对象的。它们通常用于将方法作为参数传递给其他方法,实现回调功能。
委托的关键特性:
- 类型安全: 委托是类型安全的,这意味着方法的签名必须与委托的签名匹配。
- 多播: 一个委托可以持有对多个方法的引用。当调用该委托时,它会依次调用所有方法。
- 异步回调: 委托可以异步调用方法,使用
BeginInvoke
和EndInvoke
方法。
事件(Event):
事件是一种特殊形式的委托,专门用于信号通知。它提供了一种类之间或对象之间的通信方式,当某个事件发生时,一个类可以通知其他类。事件通常在发布-订阅模型的上下文中使用,其中一个类(发布者)发布事件,而其他类(订阅者)订阅该事件。
事件的关键特性:
- 封装性: 事件通过
event
关键字对委托进行封装,防止订阅者直接调用委托。 - 多播支持: 多个方法可以注册到一个事件,允许多个订阅者。
- 设计模式: 事件是C#中观察者设计模式的一部分,促进发布者和订阅者之间的松耦合。
示例:
我们在开发过程中,通常会遇到:在某一情况下,需要调用某个函数的时候,这个时候我们就可以使用委托与事件。
举个例子,在Unity中,如果要实现在按下某个按钮时,销毁某些物品,我们就可以使用委托与事件。
我在Unity中创建了三个物体,一个为胶囊体,一个是正方体,一个是圆球。我现在将实现当按下按键时,销毁胶囊和圆球。
首先我们在正方体上面挂载一个SendEvent脚本,该脚本代码如下:
1 using UnityEngine; 2 3 public class SendEvent : MonoBehaviour 4 { 5 public int second = 5; 6 public delegate void SendEventDelegate(int second);//声明委托 7 public static event SendEventDelegate DestoryObject;//声明一个事件 8 9 void Update() 10 { 11 if (Input.GetKeyDown(KeyCode.F1) && DestoryObject != null) 12 { 13 DestoryObject(second); 14 } 15 } 16 }
接着我们在要销毁的物体上面挂在一个ReciveEvent脚本,该脚本代码如下:
1 using UnityEngine; 2 3 public class ReciveEvent : MonoBehaviour 4 { 5 private void OnEnable() 6 { 7 SendEvent.DestoryObject += DestroyGameObject;//将销毁的函数添加到事件上 8 } 9 10 private void OnDisable() 11 { 12 SendEvent.DestoryObject -= DestroyGameObject;//将销毁的函数从事件中消去 13 } 14 15 public void DestroyGameObject(int second) 16 { 17 Destroy(gameObject, second);//销毁函数 18 } 19 }
其实上述的功能,我们通过Unity中自带的SendMessage方法也可以完成,因为这是一个很简单的调用,但是SendMessage方法使用了反射机制,性能开销大。
委托和事件,相对来说类型更加安全,并且一个事件可以有多个订阅者,在多订阅者的情况下很好用。这里的订阅者其实也就是DestroyGameObject函数,一个事件可以添加很多个函数,这样调用一个事件,就可以完成一系列的动作。并且委托和事件写代码属于松耦合,更加的灵活。