C#事件的订阅与触发

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();
    }

结果如下图

“`
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

话与山鬼听

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值