原創 委託和事件

2022-01-11 17:55:15 字數 3580 閱讀 7787

委託和事件
這兩天重新溫習了一下關於委託和事件方面的知識,總結一下。

一.委託

委託就是能夠將方法作為變數來傳遞。

c#中使用委託的具體步驟是:

(1)委託的宣告。其引數形式一定要和想要包含的方法的引數形式一致。委託可以在程式執行時呼叫不同的方法,只要這個方法簽名和委託簽名保持一致。

格式:[修飾符]  delegate  返回型別   委託號(引數列表)

例如:  

public

delegate

void mydelegate1(string

input);//無返回值 有引數

public

delegate

double mydelegate2();//無引數

宣告乙個委託的物件,與宣告乙個普通類物件的方式一樣。

myclass1 cls = new

myclass1();

mydelegate1 d1;

d1 = new

mydelegate1(cls.dmethod1);

mydelegate1 d2 = new

mydelegate1(d1);

mydelegate2 d3 = new mydelegate2(cls.dmethod3);

委託名    委託物件;

(2)定義所有要定義的方法,其引數形式和第一步中宣告的委託物件的引數形式必須相同。

定義委託相對應的方法:

public

void dmethod1(string

input)

",input);

}public

void dmethod2(string

input)

",input);

}public

double

dmethod3()

(3)建立委託物件(將上面寫的方法包含其中)

view code

1 myclass1 cls=new myclass();  //

例項化物件

23 mydelegate d1=new

mydelegate(cls.dmethod1);

45 mydelegate d2=new

mydelegate(cls.dmethod2);

67 mydelegate d3=new mydelegate(cls.dmethod3);

(4)通過委託物件呼叫包含在其中的方法

d1("你好"

);d2(

"生活著,學習著!");

double dbtemp=d3();

詳細例項:

class

myclass1

",input);

}public

void dmethod2(string

input)

",input);

}public

double

dmethod3()

}class

program

}

二.事件

(1)事件的宣告

事件是類成員,以關鍵字event宣告。

格式:[修飾符]  event 委託名 事件名;

所有的事件是通過委託來啟用的,其返回值型別一般是void型。

例子: delegate void myeventhandler();

class

myevent

(2)事件的預定與取消

事件的預定就是向委託的呼叫列表中新增方法,是通過事件加上運算子+=來實現的。

格式:事件名+=new 委託名(方法名);

例如:

myevent evt=new

myevent();

evt.active+=new eventhandler(handler);

在winform窗體中

okbutton.click+=new eventhandler(okbutton.click);
只要事件被觸發,所預定的方法就會被呼叫。

事件的取消

格式:事件名 -=new 委託名(方法名);

okbutton.click-=new eventhandler(okbutton.click);
對於事件的操作只能使用+=和-=這兩種運算子。

(3)事件的發生

事件的發生就是對事件相對應的委託的呼叫,也就是委託的呼叫列表中包含的各個方法的呼叫。

格式:事件名(引數);

詳細例項:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

_02委託和事件01}}

static

void

handler()

static

void main(string

args)}}

委託的常用格式:

delegate void 委託名(object  sender,eventargs  e);

總結一下:委託是乙個引用方法的物件,當建立乙個委託,也就建立了乙個引用方法的物件,進而就可以呼叫那個方法,即委託可以呼叫它所預定的方法。委託是對方法的抽象,它將方法的呼叫與實現分離,方法的呼叫者(即委託的執行者)不知道方法的內部如何實現,而方法的實現者也不知道什麼時候被呼叫,委託理所當然成為實現事件的機制。

錯誤或者不當之處望各位大神指點

《續》先簡要說一下obsever設計模式

observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。

class

program

class

heater

}protected

virtual

void

onboiled(boiledeventargs e)

}public

void

boilwater()}}

}

class

alarm

--",heater.area ,heater.type);

console.writeline(

"alarm:嘀嘀,水已經度了

",e.temperature);

console.writeline();}}

class

display

--",heater.area,heater.type);

console.writeline(

"display:水快燒開了,當前溫度為:度

",e.temperature);

console.writeline();}}

關於委託和事件的示例(原創)

關於委託和事件,許多高手都已經對此進行了很詳盡的描述,昨晚突然想到乙個情景,於是今天寫了這個委託和事件的例子出來,純粹是為了練習一下,也希望這篇隨筆對您有幫助!情景大概是這樣的 有乙個老師,他教好幾個班級,然後每次考試後,他都會小小懲罰成績低於幾個班級成績的平均分的同學,同學們自然會很怕受罰啊,考完...

委託和事件

主要過程如下 1.在後台 中,我們可以定義處理程式方法alartrang 2.然後定義委託,引用到處理程式方法的例項。3.最後將委託新增到事件中。從而,引發事件時就會呼叫相關的事件處理方法。若要使用在另乙個類中定義的事件,必須定義和註冊乙個事件處理程式。事件 處理程式必須具有與為事件宣告的委託相同的...

委託和事件

委託的宣告 public delegate void mydelegate string str 注1.委託的定義和方法的定義類似,只是在前面加了乙個delegate,但委託不是方法,它是一種型別。是一種特殊的型別,看成是一種新的物件型別比較好理解。用於對與該委託有相 同簽名的方法呼叫。2.委託相當...