C 中的委託和事件

2021-05-24 12:58:57 字數 2463 閱讀 8559

委託 和 事件在 .net framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸c#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麼是委託、為什麼要使用委託、事件的由來、.net framework中的委託和事件、委託和事件對observer設計模式的意義,對它們的中間**也做了討論。

我們先不管這個標題如何的繞口,也不管委託究竟是個什麼東西,來看下面這兩個最簡單的方法,它們不過是在螢幕上輸出一句問候的話語:

public void greetpeople(string name) 度了:" , param);

// 顯示水溫

private void showmsg(int param) 度。" , param);

class program 度了:" , param);

// 顯示器

public class display度。" , param);

這裡就出現了乙個問題:如何在水燒開的時候通知報警器和顯示器?在繼續進行之前,我們先了解一下observer設計模式,observer設計模式中主要包括如下兩類物件:

subject:監視物件,它往往包含著其他物件所感興趣的內容。在本範例中,熱水器就是乙個監視物件,它包含的其他物件所感興趣的內容,就是temprature欄位,當這個欄位的值快到100時,會不斷把資料發給監視它的物件。 observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。在本範例中,observer有警報器和顯示器,它們採取的行動分別是發出警報和顯示水溫。 在本例中,事情發生的順序應該是這樣的:

警報器和顯示器告訴熱水器,它對它的溫度比較感興趣(註冊)。 熱水器知道後保留對警報器和顯示器的引用。 熱水器進行燒水這一動作,當水溫超過95度時,通過對警報器和顯示器的引用,自動呼叫警報器的makealert()方法、顯示器的showmsg()方法。 類似這樣的例子是很多的,gof對它進行了抽象,稱為observer設計模式:observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。observer模式是一種松耦合的設計模式。

我們之前已經對委託和事件介紹很多了,現在寫**應該很容易了,現在在這裡直接給出**,並在注釋中加以說明。

using system;

using system.collections.generic;

using system.text;

namespace delegate 度了:", param);

// 顯示器

public class display 度。", param);

class program - : ", heater.area, heater.type);

console.writeline("alarm: 嘀嘀嘀,水已經 度了:", e.temperature);

console.writeline();

// 顯示器

public class display - : ", heater.area, heater.type);

console.writeline("display:水快燒開了,當前溫度:度。", e.temperature);

console.writeline();

class program {

static void main() {

heater heater = new heater();

alarm alarm = new alarm();

heater.boiled += alarm.makealert; //註冊方法

heater.boiled += (new alarm()).makealert; //給匿名物件註冊方法

heater.boiled += new heater.boiledeventhandler(alarm.makealert); //也可以這麼註冊

heater.boiled += display.showmsg; //註冊靜態方法

heater.boilwater(); //燒水,會自動呼叫註冊過物件的方法

輸出為:

alarm:china xian - realfire 001:

alarm: 嘀嘀嘀,水已經 96 度了:

alarm:china xian - realfire 001:

alarm: 嘀嘀嘀,水已經 96 度了:

alarm:china xian - realfire 001:

alarm: 嘀嘀嘀,水已經 96 度了:

display:china xian - realfire 001:

display:水快燒開了,當前溫度:96度。

// 省略 ...

C 中的委託和事件

委託類似於c 中的函式指標,c 中的委託申明如下 delegate void mydelegate 只要該委託執行的方法與委託申明的簽名一致,就能呼叫委託來執行該方法,例如在本例中,有個方法為 void method 那麼就可以如下呼叫 mydelegate delegate new mydeleg...

C 中的委託和事件

較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,下面的例子如果能很好的理解了,那麼基本的委託和事件就基本有所了解了!namespace 委託和事件 方法三委託的定義 public delegate void greetdelegate...

C 中的委託和事件

1 委託 委託是定址方法的.net版本。它在功能上與c 中的函式指標類似,但是函式指標不是型別安全的,因為無法判斷這個指標實際上是指向什麼,引數和返回型別也不知道。而委託則是型別安全的類,它定義了返回型別和引數的型別。委託類既可以引用乙個方法,也可以引用多個方法。我們用書上的乙個例子來看如何使用委託...