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

执行结果如下:C#事件的订阅与触发_第1张图片

二、带有参数的事件订阅
首先定义一个传递参数的类,可以是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 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(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();
    }

结果如下图

“`
C#事件的订阅与触发_第2张图片

你可能感兴趣的:(C#)