C#事件的订阅与触发

来源:互联网 发布:高达 知乎 编辑:程序博客网 时间:2024/06/06 03:36

C#有关事件的使用-进阶版
用猫和老鼠的示例
一、简单的情况,无参数订阅事件

//定义一个事件委托public delegate void mcEventHandler();//定义一个猫类class Cat    {        string cName;        //定义一个猫叫事件        public event mcEventHandler CatCryEvent;         public Cat(string name)        {            cName = name;        }        //当猫叫时候,触发事件        public void Cry()        {            Console.WriteLine(cName+"来了");            Console.ReadLine();            //触发事件            CatCryEvent();        }    }    //定义一个鼠类    class Mouse    {        public string mName;        //在构造函数中进行订阅        public Mouse(Cat cat)        {            //订阅事件的两种形式            cat.CatCryEvent += Run;            cat.CatCryEvent += new mcEventHandler(See);        }        private void Run()        {            Console.WriteLine("猫来了,"+mName+"先走一步");        }        private void See()        {            Console.WriteLine("看看猫还在不在");            Console.ReadLine();        }    }    //主函数中实例化对象    class Program    {        static void Main(string[] args)        {            Cat cat1 = new Cat("Tom");            Mouse m1 = new Mouse(cat1);            //调用函数,以触发猫叫事件            cat1.Cry();        }    }

执行结果如下:这里写图片描述

二、带有参数的事件订阅
首先定义一个传递参数的类,可以是EventArgs类的派生类(继承该类),也可以是string、int这种简单类,或者是其他自定义类型
这里定义一个CryEventArgs类传递参数

class CryEventArgs:EventArgs    {        //存储一个字符串          public string CatName        {            get;            set;        }    }

接下来设计Cat类和Mouse类

  class Cat    {        string cName;        public event mcEventHandler CatCryEvent;        //定义带有参数的事件,此处CryEventArgs可以为其他简单类,如是,下面订阅的函数的签名需要相应地改变        public event EventHandler<CryEventArgs> CatCryEvent1;        public Cat(string name)        {            cName = name;        }        public void Cry()        {            Console.WriteLine(cName+"来了");            Console.ReadLine();            //用这个保存参数            CryEventArgs e = new CryEventArgs();            e.CatName = cName;            //触发事件            //CatCryEvent();            CatCryEvent1(this, e);        }    }    class Mouse    {        public Mouse(Cat cat)        {            //订阅事件的两种形式            //cat.CatCryEvent1 += Run;            cat.CatCryEvent1 += new EventHandler<CryEventArgs>(Run);        }        private void Run(object sender,CryEventArgs e)        {            if(e.CatName=="Tom")            {                Console.WriteLine("别怕,是Tom这只傻猫");                Console.ReadLine();            }            else            {                Console.WriteLine("快跑啊,是其他猫!");                Console.ReadLine();            }        }    }    //主函数,模拟事件发生    public static void Main()    {         Cat c1 = new Cat("Tom");         Cat c2 = new Cat("Ben");         //两只老鼠,分别见到两只猫         Mouse m = new Mouse(c1);         Mouse m2 = new Mouse(c2);         c1.Cry();         Console.WriteLine("//-----------------而另一边---------------------//");         c2.Cry();    }

结果如下图

“`
这里写图片描述

2 0