Ombud (Visual Basic)

Ombud är objekt som refererar till metoder. De beskrivs ibland som typsäkra funktionspekare eftersom de liknar funktionspekare som används i andra programmeringsspråk. Men till skillnad från funktionspekare är Visual Basic ombud en referenstyp som baseras på klassen System.Delegate. Ombud kan referera till båda delade metoder – metoder som kan anropas utan en specifik instans av en klass – och instansmetoder.

Ombud och händelser

Ombud är användbara i situationer där du behöver en mellanhand mellan en samtalsprocedur och den procedur som anropas. Du kanske till exempel vill att ett objekt som genererar händelser ska kunna anropa olika händelsehanterare under olika omständigheter. Tyvärr kan objektet som lyfter händelserna inte veta i förväg vilken händelsehanterare som hanterar en specifik händelse. Visual Basic kan du dynamiskt associera händelsehanterare med händelser genom att skapa ett ombud åt dig när du använder -instruktionenAddHandler. Vid körning vidarebefordrar ombudet anrop till lämplig händelsehanterare.

Även om du kan skapa egna ombud skapar Visual Basic i de flesta fall ombudet och tar hand om informationen åt dig. En instruktion definierar till exempel Event implicit en ombudsklass med namnet <EventName>EventHandler som en kapslad klass i klassen som innehåller -instruktionen Event och med samma signatur som händelsen. Instruktionen AddressOf skapar implicit en instans av ett ombud som refererar till en specifik procedur. Följande två kodrader är likvärdiga. På den första raden visas en explicit skapande av en instans av EventHandler, med en referens till metoden Button1_Click som skickas som argument. Den andra raden är ett bekvämare sätt att göra samma sak.

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

Du kan använda det korta sättet att skapa ombud var som helst där kompilatorn kan bestämma ombudets typ efter kontext.

Deklarera händelser som använder en befintlig ombudstyp

I vissa situationer kanske du vill deklarera en händelse för att använda en befintlig ombudstyp som dess underliggande ombud. Följande syntax visar hur:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Detta är användbart när du vill dirigera flera händelser till samma hanterare.

Delegera variabler och parametrar

Du kan använda ombud för andra, icke-händelserelaterade uppgifter, till exempel fri trådning eller med procedurer som behöver anropa olika versioner av funktioner vid körning.

Anta till exempel att du har ett klassificerat annonsprogram som innehåller en listruta med namnen på bilar. Annonserna sorteras efter rubrik, vilket vanligtvis är bilens märke. Ett problem du kan stöta på uppstår när vissa bilar inkluderar året för bilen före märke. Problemet är att den inbyggda sorteringsfunktionen i listrutan endast sorteras efter teckenkoder. Det placerar alla annonser som börjar med datum först, följt av annonserna som börjar med make.

För att åtgärda detta kan du skapa en sorteringsprocedur i en klass som använder den alfabetiska standardsorteringen i de flesta listrutor, men som kan växla vid körning till den anpassade sorteringsproceduren för bilannonser. Det gör du genom att skicka den anpassade sorteringsproceduren till sorteringsklassen vid körning med ombud.

AddressOf- och Lambda-uttryck

Varje ombudsklass definierar en konstruktor som skickas specifikationen för en objektmetod. Ett argument till en delegerad konstruktor måste vara en referens till en metod eller ett lambda-uttryck.

Om du vill ange en referens till en metod använder du följande syntax:

AddressOf [expression.]methodName

Kompileringstidstypen expression för måste vara namnet på en klass eller ett gränssnitt som innehåller en metod för det angivna namnet vars signatur matchar signaturen för ombudsklassen. methodName kan vara antingen en delad metod eller en instansmetod. methodName är inte valfritt, även om du skapar ett ombud för standardmetoden för klassen.

Om du vill ange ett lambda-uttryck använder du följande syntax:

Function ([parm Som type, parm2 som type2, ...]) expression

I följande exempel visas både AddressOf och lambda-uttryck som används för att ange referensen för ett ombud.

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

Signaturen för funktionen måste matcha den för ombudstypen. Mer information om lambda-uttryck finns i Lambda-uttryck. Fler exempel på lambda-uttryck och AddressOf tilldelningar till ombud finns i Avslappnad ombudskonvertering.

Rubrik Beskrivning
Anvisningar: Anropa en ombudsmetod Innehåller ett exempel som visar hur du associerar en metod med ett ombud och sedan anropar den metoden via ombudet.
Anvisningar: Skicka procedurer till en annan procedur i Visual Basic Visar hur du använder ombud för att skicka en procedur till en annan procedur.
Avslappnad ombudskonvertering Beskriver hur du kan tilldela underdelar och funktioner till ombud eller hanterare även om deras signaturer inte är identiska
Händelser Ger en översikt över händelser i Visual Basic.