共用方式為


委派 (Visual Basic)

委派(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 typeparm2 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 中事件的概觀。