Delegate(CLI)
委託(delegate)是一種類型安全的函式指標,用佇通用語言執行庫 ( CLI )。佇咧 C # 中,delegate 是一種 class,包裝一个抑是濟个函式的指標佮結束的類別實例。Delegate 用來實現函式回呼佮事件接收(event listener)。 Delegate 物件會當做參數傳達予其他函式,以參照(referenced)封裝佇 delegate 物件內底的函式,無需要佇咧編譯時刻就結束予人叫函式。
一旦為著委託分配著函式方法,委託將佮該函式的方法具有完全仝款的行為。佮委託的類型特徵(由返回類型和參陣列做)匹配的任何方法攏會當分配應該委託。
C # 例
聲明一个 ` delegate ` 類型,這號做 ` SendMessageDelegate ` , 以一个 ` Message ` 類型做參數,倒轉類型做 ` void ` :
下述代碼定義一个函式,以一个實例化的 delegate 類型作為形參 :
共封裝入去 delegate 中的一个函式的定義:
函式 SendMessage,以 SendMessageDelegate 做委託的實例做為實參:
委託實例會當封裝濟个函式:
技術實現細節
「 委託」做類,繼承自 System . MulticastDelegate(抽象類)。「委託」上無零个參數,至加三十二个參數,會當無倒轉來值,嘛會當指定返回值類型。會當認為包括:一个類物件實例的位址(Target 屬性), 該當的一个方法的地址(Method 屬性), 以及另外一个「委託」實例的參照(reference)。 所以參照一个「委託」東西,這可能實際上有參照真濟个「委託」的實例。「委託」東西被呼叫時代,照稱呼內底的濟个「委託」的實例。這對事件驅動的程式較有路用。
若是「委託」來封裝一个靜態函式,則其內部的結束的類物件位址為 null。
會當通過 Delegate 類的 GetInvocationList ( ) 共遮的委託共號出來,並檢視其實 Target 和 Method 屬性,提著所參照的方法名等的資訊。
泛型委託
關鍵字 ` Action ` 定義無回值的泛型委託。` Action ` 對零个參數,至加十六个參數。比如講:
` ` ` public Action < int > cwdelegate ; / / 定讞一个委托 cwdelegate,li̋n-jín是 int,被返回值。
` ` `
關鍵字 ` Func ` 定義有轉來值的泛型委託。對零个參數,至加十六个參數。其中上正爿的泛型類型是倒轉值類型。
關鍵字 ` Predict ` 定義矣倒轉來值為 bool 的泛型委託。
實例前,無摻喔 event,這委託就是一个普通的委託,會當佇別的函式當中呼叫,嘛會當直接用物件呼叫。毋過加上 event 關鍵字了後,干焦會當用一个員函式呼叫
用途
定定用的用途是事件處理。CLI 定義矣控制項的標準的事件處理定式是一个「委託」,聲明如下:
遮的第一个參數是發出該事件的控制項的基本類型 object;後一个參數是事件資料的基本類型 EventArgs。以 Button 控制項類做例,伊有一个屬性 Click,定義做一个 EventHandle 類型的 delegate :
到此,咱對一个具體的 button 實例變數,會當予伊的 Click 事件逐加上一个足濟代誌處理常式:
對於 Visual Basic,欲共語句寫法是:
參考文獻
外部連結
- MSDN documentation for Delegates
- Delegates with sample code
- Sun's White Paper on Delegates
- Microsoft answer to Sun
- Inner workings of Delegates
- PerfectJPattern Open Source Project , Provides componentized i . e . context-free and type-safe implementation of the Delegates Pattern in Java