Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
Relaterade ämnen
| 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. |