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 事件名稱;