瞭解c#中的事件處理機制

今天一朋友問我在程序中怎麼實現事件。於是我總結了哈發出來。要明白事件,首先要知道什麼是委託。在C#中委託允許開發人員
將一個對象中的方法傳遞給另一個能調用該方法的類的某個對象。比如:可以將類AC中的一個方法ADD[前提是這個方法以被包含在某個委託中了]傳遞給另一個類WMS。此時類WMS就能調用類AC中的ADD了。當然不管你是以什麼方式實現方法的傳遞了,可以是靜態的,也可以是實例化的。。要實現一個委託,需要按照這樣的不揍:
A:申明委託對象。注意:參數一定要和你想要包含的方法的參數形式一致。
public delegate void NeweggDelegate(string values)
B:定義方法
class NeweggClass1{
 public viod NeweggMethod1(string values){}
public viod NeweggMethod2(string values){}
....}
 C:創建一個委託對象此時將這個方法包含在該委託對象中
class NeweggClass2{
public NeweggDelegate createDelegate()
{NeweggClass1 obj1=new NeweggClass1(); 
NeweggDelegate dele1=new NeweggDelegate(obj1.NeweggMethod1);
NeweggDelegate dele2=new NeweggDelegate(obj1.NeweggMethod2);
NeweggDelegate dele3=dele1+dele2;//屬於多點委託了
return dele3;
}
}
 D:再調用包含在委託中的方法。
class NeweggClass3
{
public void NeweggCallDelegate(NeweggDelegate de,string values)
{de(values);}
}
class test
{
static void Main(string[] args)
{
NeweggClass2 cls2=new NeweggClass2();
NeweggDelegate  delel=cls2.createDelegate();
NeweggClass3 cls3=new NeweggClass3();
cls3.NeweggCallDelegate(delel,"deleagte is used");
}
}
而事件是具有特定參數的委託對象而已。格式象:public delegate void NeweggEventHandler(object sender,NeweggEventArgs e);
sender表示觸發該事件的對象,e表示在事件處理函數裏可以被使用的一些數據象NeweggEventArgs可以繼承自EvenetArgs類。當然有的時候不需要派生自己的類想一些GUI的程序,裏面有很多縣城的事件使用如:MouseEventArgs。否則必須從EventArgs類派生。
現在舉例如下:
using System;

br /> //步驟1:聲明委託對象 
public delegate void MyHandler1(object sender,MyEventArgs e); 
public delegate void MyHandler2(object sender,MyEventArgs e); 
//步驟2:創建事件處理函數的方法 
class A{ 
public const string m_id="Class A"; 
public void OnHandler1(object sender,MyEventArgs e){ 
Console.WriteLine("I am in OnHandler1 and MyEventArgs is {0}", 
e.m_id); 

public void OnHandler2(object sender,MyEventArgs e){ 
Console.WriteLine("I am in OnHandler2 and MyEventArgs is {0}", 
e.m_id); 

//步驟3:創建委託對象,並事件處理函數包含在其中同時設置好將要觸發事件的對象 
public A(B b){ 
MyHandler1 d1=new MyHandler1(OnHandler1); 
MyHandler2 d2=new MyHandler2(OnHandler2); 
b.Event1 +=d1; 
b.Event2 +=d2; 


//步驟4:通過委託對象(也就是觸發事件)來調用被包含的方法 
class B{ 
public event MyHandler1 Event1; 
public event MyHandler2 Event2; 
public void FireEvent1(MyEventArgs e){ 
if(Event1 != null){ 
Event1(this,e); 


public void FireEvent2(MyEventArgs e){ 
if(Event2 != null){ 
Event2(this,e); 



public class MyEventArgs EventArgs{ 
public string m_id; 

public class Driver{ 
public static void Main(){ 
B b= new B(); 
A a= new A(b); 
MyEventArgs e1=new MyEventArgs(); 
MyEventArgs e2=new MyEventArgs(); 
e1.m_id ="Event args for event 1"; 
e2.m_id ="Event args for event 2"; 
b.FireEvent1(e1); 
b.FireEvent2(e2); 

}

轉自http://www.codes51.com/article/detail_35140.html

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章