委派(delegate)是參照方法的物件。 它們有時描述為 類型安全 函式指標,因為它們類似於其他程式設計語言中使用的函式指標。 但與函式指標不同,Visual Basic 的委派是一種以類別System.Delegate為基礎的參考型別。 委派既可以參考共享方法 — 即不需要在特定類別實例上就能呼叫的方法 — 也可以參考實例方法。
代表與活動
當您需要呼叫程式與所呼叫程式之間的中繼時,委派會很有用。 例如,您可能想要引發事件的 對象能夠在不同情況下呼叫不同的事件處理程式。 不幸的是,引發事件的對象無法事先知道處理特定事件的事件處理程式。 Visual Basic 讓您在使用 AddHandler 語句時,為您建立委派,以動態方式將事件處理程序與事件關聯。 在運行時間,委派會將呼叫轉送至適當的事件處理程式。
雖然您可以建立自己的委派,但在大多數情況下,Visual Basic 會建立委派,併為您處理詳細數據。 例如, Event 語句會隱含地將名為 <EventName>EventHandler 的委派類別定義為包含 Event 語句之類別的巢狀類別,以及與 事件相同的簽章。 語句 AddressOf 會隱含地建立參考特定程式的委派實例。 下列兩行程式代碼相等。 在第一行中,您會看到 實例 EventHandler的明確建立,並參考做為 自變數傳送的方法 Button1_Click 。 第二行是執行相同動作更方便的方法。
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
' The following line of code is shorthand for the previous line.
AddHandler Button1.Click, AddressOf Me.Button1_Click
您可以使用創建委派的速記方法,編譯器可以透過上下文判斷委派的類型。
宣告使用現有委派類型的事件
在某些情況下,您可能會想要宣告事件,以使用現有的委派類型作為其基礎委派。 下列語法示範如何:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
當您想要將多個事件路由至相同的處理程式時,這會很有用。
委派變數和參數
您可以針對其他非事件相關工作使用委派,例如自由線程或搭配需要在執行階段呼叫不同函式版本的程式。
例如,假設您有一個分類廣告應用程式,其中包含具有汽車名稱的清單框。 廣告是按標題排序的,一般來說,標題是汽車的品牌。 當某些汽車在製造前包含汽車年份時,您可能會遇到的問題。 問題是清單框的內建排序功能僅依據字元碼進行排序:因此它會把所有從日期開始的廣告置於前面,然後再排列那些以品牌開始的廣告。
若要修正此問題,您可以在大部分清單框中使用標準字母排序的類別中建立排序程式,但能夠在運行時間切換至汽車廣告的自定義排序程式。 若要這樣做,您可以使用委派,在運行時間將自定義排序程序傳遞至排序類別。
AddressOf 和 Lambda 表示式
每個委派類別都會定義傳遞物件方法規格的建構函式。 委派建構函式的參數必須是方法的參考或 Lambda 表達式。
若要指定方法的參考,請使用下列語法:
AddressOf [expression.]methodName
expression 的編譯時間類型必須是包含指定名稱方法的類別或介面的名稱,而該方法的簽章需符合委派類別的簽章要求。
methodName可以是共用方法或實例方法。
methodName不是可選的,即使您為類別的預設方法建立委派也是如此。
若要指定 Lambda 運算式,請使用下列語法:
Function([parm As type,parm2 As type2,...])expression
下列範例顯示如何運用 AddressOf 和 Lambda 運算式,來指定委派的參考。
Module Module1
Sub Main()
' Create an instance of InOrderClass and assign values to the properties.
' InOrderClass method ShowInOrder displays the numbers in ascending
' or descending order, depending on the comparison method you specify.
Dim inOrder As New InOrderClass
inOrder.Num1 = 5
inOrder.Num2 = 4
' Use AddressOf to send a reference to the comparison function you want
' to use.
inOrder.ShowInOrder(AddressOf GreaterThan)
inOrder.ShowInOrder(AddressOf LessThan)
' Use lambda expressions to do the same thing.
inOrder.ShowInOrder(Function(m, n) m > n)
inOrder.ShowInOrder(Function(m, n) m < n)
End Sub
Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
Return num1 > num2
End Function
Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
Return num1 < num2
End Function
Class InOrderClass
' Define the delegate function for the comparisons.
Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
' Display properties in ascending or descending order.
Sub ShowInOrder(ByVal compare As CompareNumbers)
If compare(_num1, _num2) Then
Console.WriteLine(_num1 & " " & _num2)
Else
Console.WriteLine(_num2 & " " & _num1)
End If
End Sub
Private _num1 As Integer
Property Num1() As Integer
Get
Return _num1
End Get
Set(ByVal value As Integer)
_num1 = value
End Set
End Property
Private _num2 As Integer
Property Num2() As Integer
Get
Return _num2
End Get
Set(ByVal value As Integer)
_num2 = value
End Set
End Property
End Class
End Module
函式的簽名必須符合委派型別的簽名。 如需 Lambda 表達式的詳細資訊,請參閱 Lambda 表達式。 如需 Lambda 表達式和 AddressOf 指派委派的更多範例,請參閱 寬鬆委派轉換。
[相關主題]
| 標題 | 說明 |
|---|---|
| 如何:叫用委派方法 | 提供範例,示範如何將方法與委派產生關聯,然後透過委派叫用該方法。 |
| 作法:將程式傳遞至 Visual Basic 中的另一個程式 | 示範如何使用委派將一個程序傳遞至另一個程式。 |
| 寬鬆委派轉換 | 描述如何將子和函式指派給委派或處理程式,即使其簽章不相同 |
| 活動 | 提供 Visual Basic 中事件的概觀。 |