Dela via


Ombud (Visual Basic)

Delegater ä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-delegeringar en referenstyp baserad på klassen System.Delegate. Ombud kan referera till både 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. Med Visual Basic kan du dynamiskt associera händelsehanterare med händelser genom att skapa ett ombud åt dig när du använder -instruktionen AddHandler . Vid körning vidarebefordrar delegaten 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. Till exempel definierar en Event-instruktion implicit en delegeringsklass med namnet <EventName>EventHandler som en nästlad klass inom klassen som innehåller Event-instruktionen och med samma signatur som händelsen. Instruktionen AddressOf skapar automatiskt en instans av en delegerad som hänvisar till en specifik procedur. Följande två kodrader är likvärdiga. På den första raden ser du det explicita skapandet 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 delegater var som helst där kompilatorn kan fastställa delegatets typ i kontexten.

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ådhantering eller med procedurer som behöver anropa olika versioner av funktioner under körning.

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

För att åtgärda detta kan du skapa en sorteringsprocedur i en klass som använder den alfabetiska standardsorteringen för de flesta listrutor, men som kan byta till den anpassade sorteringsproceduren för bilannonser under körning. För att göra detta skickar du den anpassade sorteringsproceduren till sorteringsklassen vid programkörning med hjälp av delegater.

AddressOf- och Lambda-uttryck

Varje delegatklass definierar en konstruktor som får specifikationen för en objektmetod. Ett argument till en delegatkonstruktor 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

Kompileringstypen för expression måste vara namnet på en klass eller ett gränssnitt som innehåller en metod med det angivna namnet vars signatur matchar signaturen för delegatklassen. methodName Kan vara antingen en delad metod eller en instansmetod. methodName är inte valfri, även om du skapar en delegering för klassens standardmetod.

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

Funktionens signatur måste matcha den för delegattypen. Mer information om lambda-uttryck finns i Lambda-uttryck. Fler exempel på lambda-uttryck och AddressOf tilldelningar till ombud finns i Avslappnad delegatkonvertering.

Titel Beskrivning
Gör så här: Anropa en delegerad metod Innehåller ett exempel som visar hur du associerar en metod med ett ombud och sedan anropar 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 delegatkonvertering Beskriver hur du kan tilldela underdelar och funktioner till ombud eller hanterare även när deras signaturer inte är identiska
Evenemang Ger en översikt över händelser i Visual Basic.