C 中的委託和事件 六

2021-04-23 02:24:14 字數 1736 閱讀 3028

.net framework中的委託與事件

儘管上面的範例很好地完成了我們想要完成的工作,但是我們不僅疑惑:為什麼.net framework 中的事件模型和上面的不同?為什麼有很多的eventargs引數?

在回答上面的問題之前,我們先搞懂 .net framework的編碼規範:

委託型別的名稱都應該以eventhandler結束。

委託的原型定義:有乙個void返回值,並接受兩個輸入引數:乙個object 型別,乙個 eventargs型別(或繼承自eventargs)。

事件的命名為 委託去掉 eventhandler之後剩餘的部分。

繼承自eventargs的型別應該以eventargs結尾。

再做一下說明

委託宣告原型中的object型別的引數代表了subject,也就是監視物件,在本例中是 heater(熱水器)。**函式(比如alarm的makealert)可以通過它訪問觸發事件的物件(heater)。

eventargs 物件包含了observer所感興趣的資料,在本例中是temperature。

上面這些其實不僅僅是為了編碼規範而已,這樣也使得程式有更大的靈活性。比如說,如果我們不光想獲得熱水器的溫度,還想在observer端(警報器或者顯示器)方法中獲得它的生產日期、型號、**,那麼委託和方法的宣告都會變得很麻煩,而如果我們將熱水器的引用傳給警報器的方法,就可以在方法中直接訪問熱水器了。

現在我們改寫之前的範例,讓它符合 .net framework 的規範:

using system;

using system.collections.generic;

using system.text;

namespace delegate

}// 可以供繼承自 heater 的類重寫,以便繼承類拒絕其他物件對它的監視

protected virtual void onbolied(boliedeventargs e)

}// 燒水。

public void boilwater() }}

}// 警報器

public class alarm - : ", 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 }}

輸出為:

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 中的委託和事件

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

C 中的委託和事件

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