C 中的委託和事件

2021-06-04 22:39:27 字數 2292 閱讀 4788

委託類似於c++中的函式指標,c#中的委託申明如下:

delegate void mydelegate();

只要該委託執行的方法與委託申明的簽名一致,就能呼叫委託來執行該方法,例如在本例中,有個方法為:

void method();那麼就可以如下呼叫:

mydelegate _delegate = new mydelegate(method);

_delegate();

這樣做的好處在於,我只需要知道呼叫的方法的簽名,而具體的方法呼叫可以等到執行的時候用委託去繫結。例如c#高階程式設計中的舉例,對於乙個氣泡排序演算法,可能是對乙個整數陣列排序,也可能是對物件進行排序,所以排序演算法進行比較的時候就不能單純的用》=《等去判斷。不同的陣列其比較的方式不一樣,那麼我只要在排序演算法中使用委託,而在具體的呼叫時候傳遞具體的函式即可。具體請參考c#高階程式設計委託和事件相關章節。

另:委託在c#中被當做是乙個類。

事件和委託結合起來使用,構成了windows介面程式設計的基礎。事件的申明如下:

event mydelegate myevent;// 與mydelegate相關的事件

事件可以看成是乙個委託變數,事件-委託-方法的關係是:將某個方法註冊到事件中,當事件被呼叫的時候,和事件相關的委託就會去呼叫註冊的方法。

舉個例子:在醫院裡,醫生並不需要時時刻刻盯著病人,我們假定病人在出現問題的時候,就會通過某種方式(按鈴呼叫)通知相關的醫生。對應上面的關係,事件即是病人按鈴呼叫醫生,醫生接收到病人的呼叫並能進行處理。

我們使用了兩個類patient類和doctor類。在patient類裡面有個emergency的方法,表示需要呼叫醫生,會觸發呼叫事件。在doctor類中有個response方法,表示醫生接收到病人的呼叫,採取相應的措施。因為在實際中,patient可能並不知道doctor的response方法,所以在emergency方法裡面直接呼叫response是不現實的,而且造成兩者的耦合性太高,此外,如果病人需要呼叫的不是醫生,那麼。。。混亂吧。

下面輪到委託和事件出場了。我們定義了乙個委託:

public delegate void calldoctorhander(object sender, calldoctoreventargs e);
sender表示事件的發起者(此例為病人),e表示事件的相關資訊(在此處可能是病人的相關資訊,如病人姓名和房號等)。calldoctorevnetargs表示與病人資訊相關的類,事件觸發的時候,相關資訊也進行傳遞。

// 定義乙個相關事件的類,儲存病人的相關資訊

public class calldoctoreventargs : eventargs

public calldoctoreventargs(string msg)

public string message

get}

}

然後在patient類中定義乙個事件,並在emergency方法中觸發這個事件,注意,我們並不知道誰會響應這個事件,實際上,這也不是patient類所要關注的事情。

public class patient

public patient(string name, string roomnum)

public static event calldoctorhander calldoctor; // 定義事件,為委託calldoctorhander的變數

// 一旦發生緊急狀況,需要呼叫呼叫函式

// 對於patient類,它並不知道具體執行的是哪個函式,只知道函式的形式

public void emergency()

}

實際上,響應該事件的應該是doctor中的方法。

public class doctor

}

那麼,如何讓calldoctor事件發生時候,doctor會呼叫response方法響應呢?答案是通過將方法通過委託註冊到事件中。

doctor dct = new doctor();

patient pt = new patient();

patient.calldoctor += new calldoctorhander(dct.response);// 註冊方法到事件

pt.emergency();

這樣,一旦呼叫了emergency方法,就會觸發事件calldoctor,然後通過委託呼叫註冊了的方法。

執行結果:

ps:感覺自己大概理解了委託和事件,但是要詳細的講清楚還是得磨練。

C 中的委託和事件

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

C 中的委託和事件

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

C 中的委託和事件

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