委託和事件的區別和聯繫

委託,英文叫Delegate。它和C或C++中的函數指針十分相似,或者說委託是高級的函數指針。它具備兩大特色:面向對象,類型安全和可靠的。安全

 

代碼以下:函數

namespace DelegateDemothis

{spa

    public delegate void SayHandler(string name);指針

    class Programorm

    {對象

        protected void SaySmt(string name)事件

        {get

            Console.WriteLine("Hello " + name);string

        }

        static void Main(string[] args)

        {

            Program p = new Program();

            //實例化委託

            SayHandler objSay = new SayHandler(p.SaySmt);

            objSay.Invoke("委託");

            //實例化委託

            SayHandler objSay2 = p.SaySmt;

            objSay2("委託");

 

            Console.ReadKey();

        }

    }

}

經過上面代碼也能夠看出,委託其實也是一種與class、interface等相似的數據類型。委託就是對被委託函數的一次封裝,它能夠實例化,它是經過delegate關鍵字進行聲明的,今後能夠看出委託是面向對象的。

委託是類型安全的意思是指,委託的簽名要和被委託的函數的簽名一致,若是不一致,系統在編譯時就會報錯。而對於通常的函數指針來講,一般是在運行時纔會發現這種錯誤。

 

在C#中,事件就是當對象發生某些事情時,向該對象的客戶提供通知的一種方法。.NET的事件模型創建在委託機制之上,它實現了對委託的封裝。所以它是一種特殊類型的委託,更確切的說是一個多播委託(MultiDelegate)。意思是指能夠將多個事件處理函數委託交由一個事件進行託管,即當事件引起時,會調用其中的每個委託函數。下面以一個貓和老鼠的例子加以說明:當貓發出叫聲的時候,老鼠就會對這個事件做出響應。

namespace CatAndMouse

{

    class Program

    {

        static void Main(string[] args)

        {

            Cat cat = new Cat("Caffee");

            Mouse mouse = new Mouse();

            mouse.SetCat(cat);

            cat.InvokeMew();

 

            Console.ReadLine();

        }

    }

    /// <summary>

    /// 聲明一個叫聲委託

    /// </summary>

    /// <param name="cat"></param>

    public delegate void MewHandler(Cat cat);

 

    public class Cat

    {

        public string Name

        {

            get;

            set;

        }

        public Cat(string name)

        {

            this.Name = name;

        }

        //聲明事件

        public event MewHandler Mew;

        /// <summary>

        /// 事件觸發函數

        /// </summary>

        /// <param name="words"></param>

        protected void OnCatMew()

        {

            if (Mew != null)

            {

                Mew(this);

            }

        }

        /// <summary>

        /// 引起事件的方法

        /// </summary>

        public void InvokeMew()

        {

            OnCatMew();

        }

    }

 

    public class Mouse

    {

        private Cat hatedCat;

        public void SetCat(Cat cat)

        {

            this.hatedCat = cat;

            //將事件處理函數與事件綁定

            hatedCat.Mew += new MewHandler(cat_Mew);

        }

        //事件處理函數(與委託具備相同的簽名)

        void cat_Mew(Cat cat)

        {

            Console.WriteLine(string.Format("Shit!{0} Cat is Coming,Let’s go!", cat.Name));

        }

 

    }

}

根據以上代碼可知事件的大體實現流程:

一、  聲明事件源,即Cat對象

二、  事件接收者,即Mouse類

三、  定義引起事件,即InvokeMew()方法。

四、  關聯事件和事件處理方法,即hatedCat.Mew += new MewHandler(cat_Mew);

五、  客戶端調用引起事件,即cat.InvokeMew();

一樣道理,對於界面控件的系統事件來講,其實現代碼大體以下:

protected void Page_Load(object sender, EventArgs e)

        {

            Button1.Click += new EventHandler(Button1_Click);

        }

 

        void Button1_Click(object sender, EventArgs e)

        {

            //作相應的處理

        }

其實現流程和上一實例同樣,只是委託不用本身定義,系統已經自定義好了,爲EventHandler,它要求它委託的函數有兩個參數,一個是Sender,即事件源信息,另外一個e爲封裝的具體消息內容。事件名稱Click也是系統定義好的,所以使用起來比較方便。

相關文章
相關標籤/搜索