c#中事件Event聲明和觸發,以及自定義事件委托和系統委托EventHandler


c#中事件的聲明和觸發是通過定義的delegate委托類型來完成的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 事件1
{
    class Program
    {
        static void Main(string[] args)
        {
            myChangedEvent mce = new myChangedEvent();
            myEventListener mel = new myEventListener(mce);
            mce.ToString();
            mel.detach();
            mce.ToString();
        }
    }

    public delegate void myEventHandler(object s,EventArgs e);//聲明自定義的事件委托,用來執行事件的聲明,和處理方法的傳遞

    class myChangedEvent
    {
        public event myEventHandler Changed;//利用委托來聲明事件
        protected virtual void OnChanged(EventArgs e)//聲明事件觸發的方法
        {
            if (Changed != null)
                Changed(this, e);//觸發事件
        }

        public override string ToString()
        {
            OnChanged(EventArgs.Empty);//調用事件觸發方法
            return "執行ToString";
        }
    }
    class myEventListener//聲明事件監聽的類型,並為以上聲明事件傳入處理方法
    {
        private myChangedEvent mce;
        public myEventListener(myChangedEvent Mce)
        {
           mce = Mce;//利用構造函數,獲得對象的引用
           mce.Changed+=new myEventHandler(ListenerChanged);//為其事件添加自定義的處理方法
        }
        private void ListenerChanged(object s,EventArgs e)//聲明一個符合事件委托簽名的處理方法
        {
            Console.WriteLine("已經觸發事件!");
        }
        public void detach()
        {
            mce.Changed -= new myEventHandler(ListenerChanged);
        }
    }
}

 

事件的聲明過程

1.存在已經聲明的事件委托,該委托位於namespace下,可全局訪問

namespace 命名空間
{
  publice delegate void 事件委托(object sender,EventArgs e);
  
  class 類1{/*....*/}
  class 類2{/*....*/}
}

2.在數據類型中利用event和事件委托來聲明事件,並聲明事件觸發方法

class 類1
{
      public event 事件委托類型 事件名稱;
      protected virtual void 觸發事件(EventArgs e)
        {
            if (事件名稱 != null)
                事件名稱(this, e);
        }
}

3.事件綁定,利用事件聲明的對象實例,聲明符合事件委托簽名的方法,利用+=或-=來進行事件的綁定和解除

{
 
  類1 類1變量=new 類1();
  類1變量.事件名稱+=new 事件委托類型(事件處理方法);
 
}

/*...*/

public void 事件處理方法(object sender,EventArgs e)
{
  /*處理過程*/
}

4.事件觸發,代碼利用事件聲明中的觸發事件的方法即可

 

注意:.Net提供自帶的事件委托類型EventHandler(msdn:http://msdn.microsoft.com/zh-cn/library/system.eventhandler.aspx)

利用EventHandler,可以直接聲明對象事件,免去自定義委托的聲明

public event EventHandler 事件名稱;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM