天天看點

C#委托和事件 示例

//源碼參考《大話設計模式》--清華大學出版社  程傑  著

using System;

using System.Collections.Generic;

using System.Text;

namespace 委托和事件

{

    class Program

    {

        static void Main(string[] args)

        {

            //執行個體化貓Tom和老鼠Jerry和Jack

            Cat cat = new Cat("Tom");

            Mouse mouse1 = new Mouse("Jerry");

            Mouse mouse2 = new Mouse("Jack");

            //将Mouse的Run方法,通過執行個體化委托Cat.CatShoutEventHandler登記到Cat的CatShout事件當中。其中“+=”表示增加委托執行個體對象,即"add_CatShout"

            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);

            cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);

            cat.Shout();

            Console.WriteLine("\r");

            Cat1 cat1 = new Cat1("(有參)貓");

            Mouse1 mouse3 = new Mouse1("(有參)Jerry");

            Mouse1 mouse4 = new Mouse1("(有叁)Jack");

            //寫法不變

            cat1.CatShout += new Cat1.CatShoutEventHandler(mouse3.Run);

            cat1.CatShout += new Cat1.CatShoutEventHandler(mouse4.Run);

            cat1.Shout();

            Console.Read();

        }

    }

    //無參數委托事件

    class Cat

    {

        private string name;

        public Cat(string name)

        {

            this.name = name;

        }

        //申明無參數委托  CatShoutEventHandler

        public delegate void CatShoutEventHandler();

        //申明事件CatShout,它的類型是委托CatShoutEventHandler

        public event CatShoutEventHandler CatShout;

        public void Shout()

        {

            Console.WriteLine("喵,我是{0}.", name);

            if (CatShout != null)

            {

                //由于CatShout的類型是委托CatShoutEventHandler()(無參數),是以CatShout()也是無參數,無傳回值的,有參數的情況見下面的示例

                CatShout();//當執行Shou()方法時,若CatShou中有對象登記事件,則執行CatShout()方法

            }

        }

    }

    class Mouse

    {

        private string name;

        public Mouse(string name)

        {

            this.name = name;

        }

        public void Run()

        {

            Console.WriteLine("老貓來了,{0}快跑!", name);

        }

    }

    //有參數委托事件

    //增加一個新類,繼承EventArgs。作用:在事件觸發時,傳遞資料。

    public class CatShoutEventArgs : EventArgs  //EventArgs:包含事件資料的類的基類

    {

        private string name;

        public string Name

        {

            get { return name; }

            set { name = value; }

        }

    }

    class Cat1

    {

        private string name;

        public Cat1(string name)

        {

            this.name = name;

        }

        //申明有參數的委托  object對象 sender是指向發送通知的對象;CatShoutEventArgs的 args包含了所有知道接收都所需要附件的資訊

        public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs args);

        public event CatShoutEventHandler CatShout;

        public void Shout()

        {

            Console.WriteLine("喵,我是{0}.", name);

            if (CatShout != null)

            {

                CatShoutEventArgs e = new CatShoutEventArgs();//申明并執行個體化一個CatShoutEventArgs

                e.Name = this.name;               //給name屬性指派為貓的名字

                CatShout(this, e);//當事件觸發時,通過所有登記過的對象,并将發送通知的自己和所需要的資訊傳遞過去

            }

        }

    }

    class Mouse1

    {

        private string name;

        public Mouse1(string name)

        {

            this.name = name;

        }

        //增加兩個參數,以便接收貓的名字

        public void Run(object sender, CatShoutEventArgs args)

        {

            Console.WriteLine("老貓{0}來了,{1}快跑!", args.Name, name);

        }

    }

}