说明:示例借鉴自这里,但原版很不友好,于是修改了下,一目了然。
直接上代码:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _21_event_事件 { /* * 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。 * 应用程序需要在事件发生时响应事件。例如,中断。 * 事件是用于进程间通信。 * * 包含事件的类用于发布事件。这被称为 发布器(publisher) 类。 * 其他接受该事件的类被称为 订阅器(subscriber) 类。 * 事件使用 发布-订阅(publisher-subscriber) 模型。 */ class Program { static void Main(string[] args) { ChangeNumEventPublisher e = new ChangeNumEventPublisher(); Console.WriteLine("订阅之前"); e.SetValue(7); e.SetValue(11); ChangeNumEventSubscriberA a1 = new ChangeNumEventSubscriberA(); ChangeNumEventSubscriberB b1 = new ChangeNumEventSubscriberB(); ChangeNumEventSubscriberA a2 = new ChangeNumEventSubscriberA(); ChangeNumEventSubscriberB b2 = new ChangeNumEventSubscriberB(); //订阅事件 -- 思考下静态事件与非普通事件的区别 e.ChangeNumEvent += a1.NumManipulationHandler; e.ChangeNumEvent += a2.NumManipulationHandler; e.ChangeNumEvent += b1.NumManipulationHandler; e.ChangeNumEvent += b2.NumManipulationHandler; Console.WriteLine("订阅之后"); e.SetValue(12); e.SetValue(17); Console.ReadKey(); } } /// <summary> /// 包含事件的类,用于发布事件。 /// </summary> public class ChangeNumEventPublisher { private int value; public delegate void NumManipulationHandler(int num); //委托 public event NumManipulationHandler ChangeNumEvent; //事件(我更愿意叫它事件通知的注册中心),注意静态与否的影响 protected virtual void OnNumChanged() { if (ChangeNumEvent != null) //判断是否有订阅者 { Console.WriteLine("有事件发生了,有订阅者,开始通知订阅者"); ChangeNumEvent(value); //有订阅者就发布事件 } else { Console.WriteLine("有事件发生了,但没有订阅者"); } } public void SetValue(int n) { if (value != n) //只有值改变的时候才会出发事件 { value = n; OnNumChanged(); } } } /// <summary> /// 事件订阅者 /// </summary> class ChangeNumEventSubscriberA { public void NumManipulationHandler(int val) { Console.WriteLine("我是ChangeNumEventSubscriberA,是你如约召唤我。val=" + val); } } /// <summary> /// 事件订阅者 /// </summary> class ChangeNumEventSubscriberB { public void NumManipulationHandler(int val) { Console.WriteLine("我是ChangeNumEventSubscriberB,是你如约召唤我。val=" + val); } } }