C 使用委託

2021-04-25 18:32:36 字數 2459 閱讀 8154

文章整理自msdn

委託是一種引用方法的型別。一旦為委託分配了方法,委託將與該方法具有完全相同的行為。委託方法的呼叫可以像其他任何方法一樣,具有引數和返回值,如下面的示例所示:

與委託的簽名(由返回型別和引數組成)匹配的任何可訪問類或結構中的任何方法都可以分配給該委託。方法可以是靜態方法,也可以是例項方法。這樣就可以通過程式設計方式來更改方法呼叫,還可以向現有類中插入新**。只要知道委託的簽名,便可以分配自己的委託方法。 

注意:

在方法過載的上下文中,方法的簽名不包括返回值。但在委託的上下文中,簽名的確包括返回值。

將方法作為引數進行引用的能力使委託成為定義**方法的理想選擇。例如,可以向排序演算法傳遞對比較兩個物件的方法的引用。分離比較**使得可以採用更通用的方式編寫演算法。

將方法作為引數進行引用的能力使委託成為定義**方法的理想選擇。例如,可以向排序演算法傳遞對比較兩個物件的方法的引用。分離比較**使得可以採用更通用的方式編寫演算法。

委託概述

委託具有以下特點:

使用委託

委託是一種安全地封裝方法的型別,它與 c 和 c++ 中的函式指標類似。與 c 中的函式指標不同,委託是物件導向的、型別安全的和保險的。委託的型別由委託的名稱定義。下面的示例宣告了乙個名為 del 的委託,該委託可以封裝乙個採用字串作為引數並返回 void 的方法。

構造委託物件時,通常提供委託將包裝的方法的名稱或使用匿名方法。例項化委託後,委託將把對它進行的方法呼叫傳遞給方法。呼叫方傳遞給委託的引數被傳遞給方法,來自方法的返回值(如果有)由委託返回給呼叫方。這被稱為呼叫委託。可以將乙個例項化的委託視為被包裝的方法本身來呼叫該委託。例如:

委託型別派生自 .net framework 中的 delegate 類。委託型別是密封的,不能從 delegate 中派生委託型別,也不可能從中派生自定義類。由於例項化委託是乙個物件,所以可以將其作為引數進行傳遞,也可以將其賦值給屬性。這樣,方法便可以將乙個委託作為引數來接受,並且以後可以呼叫該委託。這稱為非同步**,是在較長的程序完成後用來通知呼叫方的常用方法。以這種方式使用委託時,使用委託的**無需了解有關所用方法的實現方面的任何資訊。此功能類似於介面所提供的封裝。有關更多資訊,請參見何時使用委託而不使用介面。

**的另乙個常見用法是定義自定義的比較方法並將該委託傳遞給排序方法。它允許呼叫方的**成為排序演算法的一部分。下面的示例方法使用 del 型別作為引數:

然後可以將上面建立的委託傳遞給該方法:

在控制台中將收到下面的輸出:

the number is: 3

在將委託用作抽象概念時,methodwithcallback 不需要直接呼叫控制台 -- 設計它時無需考慮控制台。methodwithcallback 的作用只是準備字串並將該字串傳遞給其他方法。此功能特別強大,因為委託的方法可以使用任意數量的引數。

將委託構造為包裝例項方法時,該委託將同時引用例項和方法。除了它所包裝的方法外,委託不了解例項型別,所以只要任意型別的物件中具有與委託簽名相匹配的方法,委託就可以引用該物件。將委託構造為包裝靜態方法時,它只引用方法。考慮下列宣告:

加上前面顯示的靜態 delegatemethod,現在我們有三個方法可由 del 例項進行包裝。

呼叫委託時,它可以呼叫多個方法。這稱為多路廣播。若要向委託的方法列表(呼叫列表)中新增額外的方法,只需使用加法運算子或加法賦值運算子(「+」或「+=」)新增兩個委託。例如:

此時,allmethodsdelegate 在其呼叫列表中包含三個方法 -- method1、method2 和 delegatemethod。原來的三個委託 d1、d2 和 d3 保持不變。呼叫 allmethodsdelegate 時,將按順序呼叫所有這三個方法。如果委託使用引用引數,則引用將依次傳遞給三個方法中的每個方法,由乙個方法引起的更改對下乙個方法是可見的。如果任一方法引發了異常,而在該方法內未捕獲該異常,則該異常將傳遞給委託的呼叫方,並且不再對呼叫列表中後面的方法進行呼叫。如果委託具有返回值和/或輸出引數,它將返回最後呼叫的方法的返回值和引數。若要從呼叫列表中移除方法,請使用減法運算子或減法賦值運算子(「-」或「-=」)。例如:

由於委託型別派生自 system.delegate,所以可在委託上呼叫該類定義的方法和屬性。例如,為了找出委託的呼叫列表中的方法數,您可以編寫下面的**:

在呼叫列表中具有多個方法的委託派生自 multicastdelegate,這是 system.delegate 的子類。由於兩個類都支援 getinvocationlist,所以上面的**在兩種情況下都適用。

多路廣播委託廣泛用於事件處理中。事件源物件向已註冊接收該事件的接收方物件傳送事件通知。為了為事件註冊,接收方建立了旨在處理事件的方法,然後為該方法建立委託並將該委託傳遞給事件源。事件發生時,源將呼叫委託。然後,委託呼叫接收方的事件處理方法並傳送事件資料。給定事件的委託型別由事件源定義。

在編譯時,對分配了兩種不同型別的委託進行比較將產生編譯錯誤。如果委託例項靜態地屬於型別 system.delegate,則允許進行比較,但在執行時將返回 false。例如:

C 委託使用

委託是乙個類,它定義了方法的型別,說白了就是將乙個方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法。可以避免在程式中大量使用 if else switch 語句,同時使得程式具有更好的可擴充套件性。它封裝了委託型別的變數,使得 在類的內部,不管你宣告它是public還是protec...

C 委託使用

c 委託使用案例 假定有兩個物件a和b,在a中例項化了物件b,那麼a可以訪問b中的方法,反過來b不能直接訪問a中的方法,所以使用委託。委託的使用步驟 條件 在a物件中例項化了b 1 在b中宣告乙個委託原型 2 在a中根據委託原型編寫所需要的委託方法 3 在b中利用宣告的委託原型宣告乙個委託變數 4 ...

c 中使用委託

對於委託的定義,我的理解就是封裝一型別的方法,然後根據傳遞進的引數,由系統來進行選擇呼叫。申明 delegate void voidoperation uint x 這申明了乙個委託,與這個委託匹配的方法格式為 不返回任何結果,引數。delegate int intoperation int x,i...