从发布者和订阅者来看事件

来源:互联网 发布:bdu 大数据 编辑:程序博客网 时间:2024/04/30 02:28

写一个事件代码,只需要记住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();        }    }}






0 0