Delen via


Gemachtigden (Visual Basic)

Gedelegeerden zijn objecten die verwijzen naar methoden. Ze worden soms beschreven als typeveilige functiewijzers , omdat ze vergelijkbaar zijn met functiepointers die worden gebruikt in andere programmeertalen. Maar in tegenstelling tot functiewijzers zijn Visual Basic gemachtigden een verwijzingstype op basis van de klasseSystem.Delegate. Gedelegeerden kunnen verwijzen naar beide gedeelde methoden( methoden die kunnen worden aangeroepen zonder een specifiek exemplaar van een klasse) en instantiemethoden.

Gemachtigden en gebeurtenissen

Gemachtigden zijn handig in situaties waarin u een tussenpersoon nodig hebt tussen een oproepprocedure en de procedure die wordt aangeroepen. U wilt bijvoorbeeld een object dat gebeurtenissen genereert, verschillende gebeurtenis-handlers onder verschillende omstandigheden kunnen aanroepen. Helaas kan het object dat de gebeurtenissen opgeeft, niet van tevoren weten welke gebeurtenis-handler een specifieke gebeurtenis verwerkt. Visual Basic kunt u gebeurtenis-handlers dynamisch koppelen aan gebeurtenissen door een gemachtigde voor u te maken wanneer u de AddHandler instructie gebruikt. Tijdens runtime stuurt de gedelegeerde aanroepen door naar de juiste gebeurtenis-handler.

Hoewel u uw eigen gemachtigden kunt maken, wordt in de meeste gevallen Visual Basic de gedelegeerde gemaakt en de details voor u verzorgd. Een instructie definieert bijvoorbeeld Event impliciet een gedelegeerdeklasse met de naam <EventName>EventHandler een geneste klasse van de klasse die de Event instructie bevat en met dezelfde handtekening als de gebeurtenis. De AddressOf instructie maakt impliciet een instantie van een gemachtigde die verwijst naar een specifieke procedure. De volgende twee regels code zijn equivalent. In de eerste regel ziet u het expliciet maken van een exemplaar van EventHandler, met een verwijzing naar de methode Button1_Click die als argument wordt verzonden. De tweede regel is een handigere manier om hetzelfde te doen.

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

U kunt de verkorte manier gebruiken om gedelegeerden te maken waar de compiler het type van de gemachtigde kan bepalen op basis van de context.

Gebeurtenissen declareren die gebruikmaken van een bestaand type gedelegeerde

In sommige situaties wilt u mogelijk een gebeurtenis declareren om een bestaand type gedelegeerde te gebruiken als de onderliggende gemachtigde. De volgende syntaxis laat zien hoe:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Dit is handig als u meerdere gebeurtenissen wilt routeren naar dezelfde handler.

Variabelen en parameters delegeren

U kunt gemachtigden gebruiken voor andere, niet-gebeurtenisgerelateerde taken, zoals gratis threading of met procedures die verschillende versies van functies tijdens runtime moeten aanroepen.

Stel dat u een geclassificeerde advertentietoepassing hebt die een keuzelijst bevat met de namen van auto's. De advertenties worden gesorteerd op titel, wat normaal gesproken het merk van de auto is. Er kan een probleem optreden wanneer sommige auto's het jaar van de auto voor het merk bevatten. Het probleem is dat de ingebouwde sorteerfunctionaliteit van de keuzelijst alleen op tekencodes sorteert; het plaatst alle advertenties beginnend met datums eerst, gevolgd door de advertenties beginnend met het merk.

U kunt dit oplossen door een sorteerprocedure te maken in een klasse die gebruikmaakt van de standaard alfabetische sortering voor de meeste keuzelijsten, maar die tijdens de uitvoering kan overschakelen naar de aangepaste sorteerprocedure voor autoadvertenties. Hiervoor geeft u de aangepaste sorteerprocedure tijdens runtime door aan de sorteerklasse met behulp van gemachtigden.

AddressOf- en Lambda-expressies

Elke gedelegeerdeklasse definieert een constructor die wordt doorgegeven aan de specificatie van een objectmethode. Een argument voor een gedelegeerde constructor moet een verwijzing naar een methode of een lambda-expressie zijn.

Gebruik de volgende syntaxis om een verwijzing naar een methode op te geven:

AddressOf [expression.]methodName

Het type compileertijd van de expression klasse moet de naam zijn van een klasse of een interface die een methode bevat van de opgegeven naam waarvan de handtekening overeenkomt met de handtekening van de gemachtigdeklasse. Dit methodName kan een gedeelde methode of een instantiemethode zijn. Dit methodName is niet optioneel, zelfs als u een gemachtigde maakt voor de standaardmethode van de klasse.

Gebruik de volgende syntaxis om een lambda-expressie op te geven:

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

In het volgende voorbeeld ziet u zowel AddressOf lambda-expressies als lambda-expressies die worden gebruikt om de verwijzing voor een gemachtigde op te geven.

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

De handtekening van de functie moet overeenkomen met die van het type gedelegeerde. Zie Lambda-expressies voor meer informatie over lambda-expressies. Zie Ontspannen gedelegeerde conversie voor meer voorbeelden van lambda-expressies en AddressOf -toewijzingen aan gemachtigden.

Titel Beschrijving
Procedure: Een gemachtigde methode aanroepen Hier ziet u een voorbeeld van hoe u een methode koppelt aan een gemachtigde en deze methode vervolgens aanroept via de gemachtigde.
Procedure: Procedures doorgeven aan een andere procedure in Visual Basic Demonstreert hoe u gemachtigden kunt gebruiken om de ene procedure door te geven aan een andere procedure.
Relaxte conversie van gedelegeerden Beschrijft hoe u subs en functies kunt toewijzen aan gedelegeerden of handlers, zelfs wanneer hun handtekeningen niet identiek zijn
Gebeurtenissen Biedt een overzicht van gebeurtenissen in Visual Basic.