unity基础学习十四,C#高级属性:C# 委托(Delegate)和 事件(Event)
C# 事件(Event)
C# 中的事件机制提供了一种发布-订阅模式,使得类能够通知其他类某些事情已经发生。事件通常是用户操作或系统生成的通知。
2.1 通过事件使用委托
事件在类中声明且生成,并通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为发布器(publisher)类。其他接受该事件的类被称为订阅器(subscriber)类。事件使用发布-订阅(publisher-subscriber)模型。
2.2 声明事件(Event)
在类的内部声明事件,首先必须声明该事件的委托类型。例如:
public delegate void BoilerLogHandler(string status); 然后,声明事件本身,使用 event 关键字:
// 基于上面的委托定义事件 public event BoilerLogHandler BoilerEventLog; 上面的代码定义了一个名为 BoilerLogHandler 的委托和一个名为 BoilerEventLog 的事件,该事件在生成的时候会调用委托。
示例代码
using System; namespace SimpleEvent { /***********发布器类***********/ public class EventTest { private int value; public delegate void NumManipulationHandler(); public event NumManipulationHandler ChangeNum; protected virtual void OnNumChanged() { if (ChangeNum != null) { ChangeNum(); /* 事件被触发 */ } else { Console.WriteLine("event not fire"); Console.ReadKey(); /* 回车继续 */ } } public EventTest() { int n = 5; SetValue(n); } public void SetValue(int n) { if (value != n) { value = n; OnNumChanged(); } } } /***********订阅器类***********/ public class subscribEvent { public void printf() { Console.WriteLine("event fire"); Console.ReadKey(); /* 回车继续 */ } } /***********触发***********/ public class MainClass { public static void Main() { EventTest e = new EventTest(); /* 实例化对象,第一次没有触发事件 */ subscribEvent v = new subscribEvent(); /* 实例化对象 */ e.ChangeNum += new EventTest.NumManipulationHandler(v.printf); /* 注册 */ e.SetValue(7); e.SetValue(11); } } } 结果
event not fire event fire event fire 在这个示例中,EventTest 类是一个发布器类,它定义了一个事件 ChangeNum。subscribEvent 类是订阅器类,它提供了一个事件处理程序 printf。通过将 printf 方法注册到 ChangeNum 事件上,当 SetValue 方法改变 value 的值时,事件会被触发,printf 方法会被调用。