一、委託和類一樣,是一種使用者自定義型別,它可以實現c++中函式指標的功能,且比函式指標更安全,功能更多!
1、委託宣告:
delegate voidanimalplay(string name) ;
//animaplay是委託的型別
2、委託例項化:
委託在使用時和類一樣(除static型別的類)要例項化,如下:deledogplay就是委託的例項
animalplaydeledogplay= new animalplay(dogplay);
//dogplay是符合委託宣告的函式格式的函式
3、委託可像函式指標一樣當做乙個函式的引數,傳入函式中。如下:
static void circusstart(animalplay animalplay, string name)
circusstart(deledogplay, "good evening");
circusstart(dogplay, "snoopy");
//新版的.net可直接傳入函式名(自動轉換),而不需要傳入例項化的委託。
4、多播委託:即委託中註冊多個函式
當呼叫委託時,按一定順序(未定義按什麼順序)呼叫所有註冊的函式。一般是用於返回值為void的函式型別委託。如果返回值不是void,執行委託時返回值為最後一次呼叫的函式的返回值。(但哪個函式被最後呼叫不知道)
animalplay animalsplay = new animalplay(dogplay);
animalsplay+= new animalplay(catplay);//catplay
是符合委託宣告的函式格式的函式
5、 另外,委託可以使用匿名函式或
lambda表示式(簡化匿名函式的表達)例項化!
6、
寬鬆委託
委託函式的引數型別可以是委託引數的基類(逆變),被委託函式的返回值型別可以是委託返回值的派生類(協變)
public delegate
animal
animalhandler
(animal
a); //委託
public static
catcatplay(
object
o) //被委託函式
則下面的語句是合法的:
animalhandlerhandler =new animalhandler(catplay);
二、事件實質上是個委託
例項,net 通過委託機制把系統和應用程式中的事件處理程式聯絡起來了
1、關於事件的委託宣告,如下eventhandler 事件的委託型別
public delegate voideventhandler(object sender, eventargs e);//sender引數表示事件的傳送至,e表示訊息本身
2、事件的宣告,和委託的例項化差不多,只是宣告前要加event關鍵字
publiceventeventhandlerclick;
public
eventeventhandlerkeypress;
event 關鍵字的作用是把事件封裝起來,即只能在宣告事件的類的內部觸發事件,在類外部只能註冊事件而不能觸發事件。比如對於在 btnok 裡宣告的 click 事件,語句 「btnok.click()」只能出現在 btnok 類內部,不能出現在類外部(儘管 click 是公有的)。對於普通的沒有用 event 關鍵字修飾的公有委託,則可以在類外呼叫。
3、事件的註冊:
btnok.click += new system.eventhandler(this.btnok_click);//btnok_click是事件的處理程式
4、要建立乙個事件驅動的程式需要下面的步驟:
(1)宣告關於事件的委託;//在dog類中
public delegate void alarmeventhandler(object sender, eventargs e);
(2)宣告事件(委託的例項化);//在dog類中
public event alarmeventhandler alarm;
(3)編寫觸發事件的函式;//在dog類中
public void onalarm()
(4)建立事件處理程式;//在host類中
void hosthandlealarm(object sender, eventargs e)
(5)註冊事件處理程式;//在host類中
public host(dog dog)
(6)在適當的條件下觸發事件。//在其他類中
dog.onalarm();
總的來說:
委託的相當於函式型別,委託例項相當於函式的別名,它的功能是實現乙個介面,從而編寫出通用的函式。事件的本質是一種委託例項,它是系統和使用者定義的事件處理程式之間的橋梁。
注:事件處理委託習慣上以
eventhandler 結尾。
注:引發事件的**常常被編寫成乙個函式, .net 約定這種函式的名稱為 「oneventname」。
C 事件和委託
c 程式設計中的事件驅動是說應用程式的執行流程是由外界發生的事件確定的。也就是接受到任務再工作的模式。事件是乙個訊號,它告知應用程式有重要的事情發生。真正的執 況是,各個應用程式把負責不同功能的物件在其執行期間送入windows作業系統,讓這些物件等待windows產生事件。然後加以處理,windo...
C 委託和事件
什麼是委託?委託和事件這兩個概念是完全配合的。委託僅僅是函式指標,那就是說,它能夠引用函式,通過傳遞位址的機制完成。委託是乙個類,當你對它例項化時,要提供乙個引用函式,將其作為它建構函式的引數 先看示例 例中先申明乙個委託,例如 public delegate void somedelegate s...
C 委託和事件
要為類構造乙個事件,必須用 event 來宣告乙個 delegate 型的字段,如 puclic calss test 在建立類的例項後定義這個 load 事件 test m new test m.load new eventhandler m load void m load object sen...