本文主要是介绍从发布者和订阅者来看事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写一个事件代码,只需要记住5个部分即可,如图所示:
1.声明委托:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型进行描述。
2.声明事件:发布者类必须声明一个订阅者类可以注册的事件成员。
3.触发事件:发布者类中触发事件,便会调用注册在事件上的所有事件处理程序。
4.注册事件:订阅者必须订阅事件才能在事件被触发时得到通知。
5.处理事件:订阅者会在事件发生后执行相应的处理程序。
一、猫和老鼠的例子(不传递数据)
代码如下:
using System;
namespace 练习专用
{//声明委托public delegate void MyDel();//发布者类-猫class Cat{//声明事件public event MyDel CatCryEvent;//在猫叫的方法中触发事件public void Cry(){Console.WriteLine("有只猫在叫。。。");//触发事件CatCryEvent();}}//订阅者类-老鼠class Mouse{public Mouse(Cat cat){//注册事件,订阅者老鼠向事件添加事件处理程序cat.CatCryEvent += Run;}//处理事件,事件发生后的处理程序void Run(){Console.WriteLine("老鼠快跑吧!!!");}}class Program{static void Main(string[] args){Cat cat1 = new Cat();Mouse mouse1 = new Mouse(cat1);cat1.Cry();}}
}
二、猫和老鼠的例子(传递数据)
可以使用System命名空间提供的EventHandler委托类型,所以不需要自己定义委托类型了,它是这么定义的:
public delegate void EventHandler(object sender, EventArgs e);
//第一个参数用来保存触发事件的对象的引用。由于是object类,所以可以匹配任何类型的实例
//第二个参数用来保存状态信息,指明什么类型适用于该应用程序
为了向事件处理程序的第二个参数传入数据,需要声明一个派生自EventArgs的自定义类来保存需要传入的数据。
代码如下:
using System;
namespace 练习专用
{//自定义一个派生自EventArgs的类,保存数据class CryEventArgs : EventArgs{//存储一个字符串public string CatName{get;set;}}//发布者类-猫class Cat{public string CatName{get;set;}//构造函数,给猫弄个名字public Cat(string name){this.CatName = name;}//声明事件,使用自定义类的泛型委托public static event EventHandler<CryEventArgs> CatCryEvent;//在猫叫的方法中触发事件public void Cry(){Console.WriteLine("有只猫在叫。。。");//把猫的名字保存到刚才的自定义类中CryEventArgs e = new CryEventArgs();e.CatName = this.CatName;//触发事件,传递参数CatCryEvent(this, e);}}//订阅者类-老鼠class Mouse{public Mouse(){//注册事件,订阅者老鼠向事件添加事件处理程序Cat.CatCryEvent += Run;}//处理事件,事件发生后的处理程序void Run(object sender, CryEventArgs e){if (e.CatName == "黑猫警长"){Console.WriteLine("是黑猫警长,老鼠快特么的跑吧!!!");}else{Console.WriteLine("不是黑猫警长,是{0},老鼠不用跑了。。。", e.CatName);}}}class Program{static void Main(string[] args){Cat cat1 = new Cat("黑猫警长");Cat cat2 = new Cat("小猫咪");Mouse mouse = new Mouse();cat1.Cry();Console.WriteLine("===============手动分割线===============");cat2.Cry();}}
}
这篇关于从发布者和订阅者来看事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!