Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Gedelegeerden zijn objecten die verwijzen naar methoden. Ze worden soms beschreven als typeveilige functiepointers , omdat ze vergelijkbaar zijn met functie-aanwijzers die in andere programmeertalen worden gebruikt. Maar in tegenstelling tot functiepointers zijn Visual Basic-gemachtigden een referentietype op basis van de klasse System.Delegate. Gemachtigden kunnen verwijzen naar beide gedeelde methoden( methoden die kunnen worden aangeroepen zonder een specifiek exemplaar van een klasse) en exemplaarmethoden.
Gemachtigden en gebeurtenissen
Gemachtigden zijn handig in situaties waarin u een intermediair nodig hebt tussen een oproepprocedure en de procedure die wordt aangeroepen. U wilt bijvoorbeeld een object dat evenementen genereert zodat het verschillende event-handlers onder verschillende omstandigheden kan aanroepen. Helaas kan het object dat de gebeurtenissen opgeeft, niet van tevoren weten welke gebeurtenis-handler een specifieke gebeurtenis verwerkt. Met Visual Basic kunt u gebeurtenishandlers dynamisch koppelen aan gebeurtenissen door een delegate voor u aan 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, maakt Visual Basic in de meeste gevallen de gemachtigde en zorgt u voor de details. Een Event
statement definieert bijvoorbeeld impliciet een delegerende klasse met de naam <EventName>EventHandler
als een geneste klasse binnen de klasse die de Event
statement bevat en die dezelfde handtekening heeft als de gebeurtenis. De AddressOf
verklaring maakt impliciet een instantie van een delegate aan die verwijst naar een specifieke procedure. De volgende twee regels code zijn gelijkwaardig. 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 door de context.
Declareren van gebeurtenissen die gebruikmaken van een bestaand delegatetype
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 naar dezelfde handler wilt routeren.
Delegeren van variabelen en parameters
U kunt gedelegeerden gebruiken voor andere taken die niet gerelateerd zijn aan gebeurtenissen, zoals vrije threading of met procedures die tijdens runtime verschillende versies van functies moeten aanroepen.
Stel dat u een advertentiesapplicatie 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 ontstaat een probleem wanneer sommige auto's het jaar van de auto vermelden voordat ze het merk noemen. Het probleem is dat de ingebouwde sorteerfunctionaliteit van de keuzelijst alleen op tekencodes sorteert; het plaatst alle advertenties die beginnen met datums eerst, gevolgd door de advertenties die beginnen met het merk.
U kunt dit oplossen door een sorteerprocedure te maken in een klasse die gebruikmaakt van de standaard alfabetische sortering op de meeste keuzelijsten, maar die tijdens runtime 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 gemachtigde klasse 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.
Als u een verwijzing naar een methode wilt opgeven, gebruikt u de volgende syntaxis:
AddressOf
[expression
.]methodName
Het compileertijdtype van de expression
moet de naam zijn van een klas of een interface die een methode bevat met de opgegeven naam waarvan de signatuur overeenkomt met de signatuur van de verantwoordelijke klas. Dit methodName
kan een gedeelde methode of een exemplaarmethode zijn. Dit methodName
is niet optioneel, zelfs niet 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
als lambda-expressies die worden gebruikt om de verwijzing voor een delegate 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 gemachtigde. Zie Lambda-expressies voor meer informatie over lambda-expressies. Zie AddressOf
voor meer voorbeelden van lambda-expressies en toewijzingen aan gemachtigden.
Verwante onderwerpen
Titel | Beschrijving |
---|---|
Procedure: Een gedelegeerde methode aanroepen | Hier ziet u een voorbeeld van hoe u een methode koppelt aan een gemachtigde en deze methode vervolgens aanroept via de gemachtigde. |
Hoe je procedures doorgeeft aan een andere procedure in Visual Basic | Demonstreert hoe u gemachtigden gebruikt om de ene procedure door te geven aan een andere procedure. |
Gedelegeerde Ontspannen Conversie | Hierin wordt beschreven hoe u subs en functies kunt toewijzen aan gemachtigden of handlers, zelfs wanneer hun handtekeningen niet identiek zijn |
Gebeurtenissen | Biedt een overzicht van gebeurtenissen in Visual Basic. |