跳至內容

Delegate(CLI)

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

委託(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