namespace EventDemo { public delegate void DeleBark();//声明委托 class Program { static void Main(string[] args)//主函数 { Dog d1 = new Dog(); d1.OnBark += Listen_Bark; d1.Bark();//狗叫触发了OnBark“事件”,执行了方法d1_Bark d1.OnBark();//欺骗 实际狗没有叫,没有调d1.Bark()方法; Dog2 d2 = new Dog2(); d2.AddBark(Listen_Bark); d2.Bark(); //无法访问到d2的OnBark()安全了! Dog3 d3 = new Dog3(); d3.OnBark+=Listen_Bark;//为事件注册响应方法 d3.Bark();//内部触发OnBark事件,执行Listen_Bark方法 Console.ReadKey(); } public static void Listen_Bark() { Console.WriteLine("狗叫了!"); } } //1、纯委托类型版“事件”,不安全 class Dog { public void Bark() { if (OnBark!=null) { OnBark();//委托的调用,依赖于Bark(),即监听了Bark() } } public DeleBark OnBark;//Dog的委托类型成员--“事件” } //2、私有委托类型的“事件”,安全可控 OnBark定义为private 的,外界不可直接访问和调用。 增加公共方法AddOnBark和RemoveBark,让外界为这个委托添加或移除方法 class Dog { public void Bark() { if (OnBark != null) { OnBark();//委托的调用,依赖于Bark(),即监听了Bark() } } private DelBark OnBark;//Dog的委托类型的私有成员--“事件” //给“事件”注册方法 public void AddBark(DeleBark dele) { OnBark += dele; } //给“事件”注销方法 public void RemoveBark(DeleBark dele) { OnBark -= dele; } } //3、真实的事件:public的事件相当于:一个私有的委托成员 加上公开的Add和Remove两个方法 // 将事件成员被设置为public的event修饰的成员。 // 封装Add方法和Remove方法,外界可通过“+=”和“-=”为期注册和注销事件响应方法。 // 由于是event修饰的,只允许内部调用,外界不能调用了。 class Dog { public void Bark() { if (OnBark != null) { OnBark();//事件的触发,依赖于Bark(),即监听了Bark() } } public event DelBark OnBark;//定义事件,用原来语言上再加event关键字修饰 } }