C#2.0的泛型代理和事件 :以一當百的快感
來源:互聯網
上載者:User
今天用C#2.0的泛型改寫了我的一個系統的訊息實現,感覺非常不錯,很簡潔而且速度快了(MSDN上那麼說的,暗示誘導使我也有此感覺,呵呵)。
我們嘮會兒嗑,回顧一下經典內容:
.NET架構的訊息模型,構建於一個串連事件控制代碼的代理(
delegate),要想觸發某個事件,兩個基本元素是必須考慮的:
1
、事件的源頭觸發者,它定義了一個事件:public class EventSender
{ ...
//聲明一個代理類型,本例中,它指向一個無傳回值的方法,並有兩個參數
public delegate void MyEventHandler(obejct sender, EventArgs e);
//由該代理執行個體化一個事件成員
public event MyEventHandler myEvent;
...
//在某個地方根據邏輯觸發(Fire)這個事件
//即向系統告知:“老大您聽好了,我發出了一個事件”
this.myEvent(this,null);
...
}
2
、事件的接收者
,
它註冊了該事件public class EventReceiver
{ ……//執行個體化上面的事件發出者類
EventSender sender = new EventSender();
//註冊EventSender的myEvent事件,即向系統告知:“如果這個對象發出了該事件,我很樂意接受”
//同時告知系統:“老大,在下我有能力並且迫切需要通過我的OnReceivedTheEvent方法處理該事件”
sender.myEvent += new MyEventHandler(OnReceivedTheEvent); …… private void OnReceivedTheEvent(object sender, EventArgs e)
{
//實現自己的處理
}
}當然,如果我們不需要傳遞自訂的(繼承的)
EventArgs,我們可以用系統已經定義的一個訊息代理
EventHandler直接去執行個體化一個事件成員,從而省去了定義代理類型的步驟。這種情況下,觸發事件的目的僅僅是起到通知的作用,不能傳遞運行時資料(因為
System.EventArgs是最基本的事件參數類,其他事件參數類都是繼承該類,比如
MouseEventArgs),沒有能力容納使用者自訂資訊,比如您想在觸發事件的同時,傳遞該對象的某個狀態值... System.EventArgs無能為力。
上面所說的是經典的事件處理模式,在C#2.0中,事件處理引入了泛型機制,從而大為便捷了我們的編程。與此配套,
EventHandler有了它的泛型版本
EventHandler<T>。下面我們通過兩個版本的代碼片斷來比較泛型給我們帶來的視覺衝擊和編程享受: -)
任務:定義和註冊三個事件,分別使用三個不同的
EventArgs繼承對象
傳遞不同的資料 //c#1.1……
//定義(在假定類MyClass中)
Public delegate void MyEventHandler1(object sender, MyEventArgs1 myEventArgs1);
Public delegate void MyEventHandler2(object sender, MyEventArgs2 myEventArgs2);
Public delegate void MyEventHandler3(object sender, MyEventArgs3 myEventArgs3);
public event MyEventHandler1 event1;
public event MyEventHandler2 event2;
public event MyEventHandler3 event3;……//註冊(假定了執行個體化MyClass)
myClass.event1 += new EventHandler(
this,myEventArgs1);
myClass.event2 += new EventHandler(
this, myEventArgs1);
myClass.event3 += new EventHandler(
this, myEventArgs1);
//C# 2.0……
//定義(在假定類MyGoodClass中)
public event EventHandler< MyEventArgs1> event 1;
public event EventHandler< MyEventArgs2> event 2;
public event EventHandler< MyEventArgs3> event 3;……//註冊(假定了執行個體化MyGoodClass)
myGoodClass.event1 += new EventHandler< MyEventArgs1>(this,myEventArgs1);
myGoodClass.event2 += new EventHandler< MyEventArgs2>(this,myEventArgs2);
myGoodClass.event3 += new EventHandler< MyEventArgs3>(this,myEventArgs3); 對比可以發現,代碼是不是簡潔了不少?其實泛型的優點和用途遠遠不止這些。它還有一個很大的好處就是型別安全和安全執行緒,以往我們需要傳遞通用資料時,往往使用object類型,雖然這種方法在技術上是可行的,但是系統在裝箱和拆箱上的開銷以及類型轉換上的風險(InvalidCastException)卻有相當的弊端。MSDN上面這樣介紹泛型:
泛型類和泛型方法同時具備可重用性、型別安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用在集合和在集合上啟動並執行方法中。
.NET Framework 2.0
版類庫提供一個新的命名空間
System.Collections.Generic
,其中包含幾個新的基於泛型的集合類。建議面向
2.0
版的所有應用程式都使用新的泛型集合類,而不要使用舊的非泛型集合類,如
ArrayList
。有關更多資訊,請參見
.NET Framework 類庫中的泛型(C# 編程指南)。