C 委託和事件

2022-08-10 18:33:13 字數 1702 閱讀 8845

委託是一種定義方法的類,這樣就可以使得方法a,可以像string類、int類一樣當做方法b的引數進行傳遞。這種將方法動態地賦值給引數的做法,可以避免在**中大量使用if-else(or switch)語句,同時使得程式具有更好的可擴充套件性。委託被大量使用在wpf中(至少我是這麼認為的)。但是委託類不同於string類和int類的區別在於,可以將多個方法賦給同乙個委託,或者說多個方法可以繫結到同乙個委託類上,當呼叫該委託時,將依次呼叫其所繫結的方法,但是string類和int類,後面繫結的引數將會替換掉前乙個引數。

事件用於封裝委託類。當使用string類時,可以通過屬性對欄位進行封裝,某個string類可以唯讀的,也可以是只寫的。使用event關鍵字,宣告乙個事件也就是宣告了乙個進行了封裝的委託型別變數,比如下面這條**:

public

event propertychangedeventhandler propertychanged;

其中,propertychangedeventhandler是乙個委託類,event關鍵字定義了乙個封裝該委託的propertychanged事件。事件封裝了委託,那麼就可以將方法註冊到事件中,當事件發生時,會依次呼叫註冊了該事件的方法。比如在wpf中,給乙個button控制項新增click方法,其實就是將btn_click方法註冊到button控制項的click事件中,即button.click += btn_click.

.net framework中對委託和事件編寫的規範:

example:這個例子**於張子陽部落格中的例子,我最開始學習委託和事件也是看了這篇部落格,所以我的這篇文章算是學習了委託和事件之後的乙個整理,目的是加深自己的記憶。張子陽的部落格位址如下:

例子是這樣的,假設有一台熱水器,當加熱到指定溫度時會提醒使用者,則有乙個加熱方法,還有乙個提醒方法。提醒方法要註冊加熱事件,當溫度達到指定值時,呼叫提醒方法。

heater類

public

class

heater

//heater類中有乙個加熱的方法

public

void

boilwater()

.", i);

if(temperature > 95

) }}

}

alarm類

public

class

alarm

.", e.temperature);

}}

客戶端程式

class

program

}

觀察者設計模式(observer)

1.subject,監視物件,它往往包含其他物件所感興趣的內容。在熱水器的例子中,熱水器就是乙個監視物件,它包含其他物件感興趣的內容,就是temperature,當這個欄位的值接近100的時候,會不斷把資料發給監視它的物件。

2.observer,監視者,在熱水器的例子中,警報器和顯示器就是監視者,它們要對監視物件中感興趣的內容進行註冊。

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

因此在熱水器的例子中,工作的流程就是,當水溫超過預定值時,將通過委託類分別呼叫警報器和顯示器中的方法,能夠呼叫這兩個方法的前提是,它們註冊了封裝該委託類的事件。

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...