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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_32832727/article/details/54800920

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






猜你喜欢

转载自blog.csdn.net/sinat_32832727/article/details/54800920