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.
Met een soepele conversie van gedelegeerden kunt u subs en functies toewijzen aan gedelegeerden of handlers, zelfs als hun handtekeningen niet identiek zijn. Daarom wordt binding met gemachtigden consistent met de binding die al is toegestaan voor methode-aanroepen.
Parameters en het retourtype
In plaats van een exact overeenkomende handtekening vereist een soepele conversie dat aan de volgende voorwaarden wordt voldaan wanneer Option Strict
is ingesteld op On
.
Er moet een verbreidingsconversie bestaan van het gegevenstype van elke gemachtigdeparameter naar het gegevenstype van de bijbehorende parameter van de toegewezen functie of
Sub
. In het volgende voorbeeld heeft de gedelegeerdeDel1
één parameter, eenInteger
. De parameterm
in de toegewezen lambda-uitdrukkingen moet een gegevenstype hebben waarvoor een verbredende conversie bestaat vanInteger
, zoalsLong
ofDouble
.' Definition of delegate Del1. Delegate Function Del1(ByVal arg As Integer) As Integer
' Valid lambda expression assignments with Option Strict on or off: ' Integer matches Integer. Dim d1 As Del1 = Function(m As Integer) 3 ' Integer widens to Long Dim d2 As Del1 = Function(m As Long) 3 ' Integer widens to Double Dim d3 As Del1 = Function(m As Double) 3
Vernauwende conversies zijn alleen toegestaan wanneer
Option Strict
is ingesteld opOff
.' Valid only when Option Strict is off: Dim d4 As Del1 = Function(m As String) CInt(m) Dim d5 As Del1 = Function(m As Short) m
Er moet een uitbreidingsconversie bestaan in de omgekeerde richting van het retourtype van de toegewezen functie of
Sub
naar het retourtype van de delegate. In de volgende voorbeelden moet de inhoud van elke toegewezen lambda-expressie evalueren tot een gegevenstype dat zich uitbreidt totInteger
omdat het retourtype vandel1
Integer
is.' Valid return types with Option Strict on: ' Integer matches Integer. Dim d6 As Del1 = Function(m As Integer) m ' Short widens to Integer. Dim d7 As Del1 = Function(m As Long) CShort(m) ' Byte widens to Integer. Dim d8 As Del1 = Function(m As Double) CByte(m)
Als Option Strict
is ingesteld op Off
, wordt de verbredingsbeperking in beide richtingen verwijderd.
' Valid only when Option Strict is set to Off.
' Integer does not widen to Short in the parameter.
Dim d9 As Del1 = Function(n As Short) n
' Long does not widen to Integer in the return type.
Dim d10 As Del1 = Function(n As Integer) CLng(n)
Het weglaten van parameterspecificaties
Met flexibele gedelegeerden kan men ook parameterspecificaties volledig weglaten in de toegewezen methode.
' Definition of delegate Del2, which has two parameters.
Delegate Function Del2(ByVal arg1 As Integer, ByVal arg2 As String) As Integer
' The assigned lambda expression specifies no parameters, even though
' Del2 has two parameters. Because the assigned function in this
' example is a lambda expression, Option Strict can be on or off.
' Compare the declaration of d16, where a standard function is assigned.
Dim d11 As Del2 = Function() 3
' The parameters are still there, however, as defined in the delegate.
Console.WriteLine(d11(5, "five"))
' Not valid.
' Console.WriteLine(d11())
' Console.WriteLine(d11(5))
Houd er rekening mee dat u bepaalde parameters niet kunt opgeven en anderen weglaat.
' Not valid.
'Dim d12 As Del2 = Function(p As Integer) p
De mogelijkheid om parameters weg te laten is handig in een situatie zoals het definiëren van een gebeurtenis-handler, waarbij verschillende complexe parameters betrokken zijn. De argumenten bij sommige event handlers worden niet gebruikt. In plaats daarvan heeft de handler rechtstreeks toegang tot de status van het besturingselement waarop de gebeurtenis is geregistreerd en worden de argumenten genegeerd. Met ontspannen gemachtigden kunt u de argumenten in dergelijke declaraties weglaten wanneer er geen dubbelzinnigheid ontstaat. In het volgende voorbeeld kan de volledig opgegeven methode OnClick
worden herschreven als RelaxedOnClick
.
Sub OnClick(ByVal sender As Object, ByVal e As EventArgs) Handles b.Click
MessageBox.Show("Hello World from" + b.Text)
End Sub
Sub RelaxedOnClick() Handles b.Click
MessageBox.Show("Hello World from" + b.Text)
End Sub
AddressOf-voorbeelden
Lambda-expressies worden in de vorige voorbeelden gebruikt om de typerelaties gemakkelijk te zien. Dezelfde versoepelingen zijn echter toegestaan voor gedelegeerde toewijzingen die gebruikmaken van AddressOf
, Handles
of AddHandler
.
In het volgende voorbeeld kunnen functies f1
, f2
, f3
en f4
allemaal worden toegewezen aan Del1
.
' Definition of delegate Del1.
Delegate Function Del1(ByVal arg As Integer) As Integer
' Definitions of f1, f2, f3, and f4.
Function f1(ByVal m As Integer) As Integer
End Function
Function f2(ByVal m As Long) As Integer
End Function
Function f3(ByVal m As Integer) As Short
End Function
Function f4() As Integer
End Function
' Assignments to function delegate Del1.
' Valid AddressOf assignments with Option Strict on or off:
' Integer parameters of delegate and function match.
Dim d13 As Del1 = AddressOf f1
' Integer delegate parameter widens to Long.
Dim d14 As Del1 = AddressOf f2
' Short return in f3 widens to Integer.
Dim d15 As Del1 = AddressOf f3
Het volgende voorbeeld is alleen geldig als Option Strict
deze is ingesteld op Off
.
' If Option Strict is Off, parameter specifications for f4 can be omitted.
Dim d16 As Del1 = AddressOf f4
' Function d16 still requires a single argument, however, as specified
' by Del1.
Console.WriteLine(d16(5))
' Not valid.
'Console.WriteLine(d16())
'Console.WriteLine(d16(5, 3))
Het verwijderen van een functie resulteert in
Met een relaxte delegate-conversie kunt u een functie toewijzen aan een Sub
delegate, waardoor de retourwaarde van de functie effectief wordt genegeerd. Echter, u kunt een Sub
niet toewijzen aan een functiedelegaat. In het volgende voorbeeld wordt het adres van de functie doubler
toegewezen aan Sub
gemachtigde Del3
.
' Definition of Sub delegate Del3.
Delegate Sub Del3(ByVal arg1 As Integer)
' Definition of function doubler, which both displays and returns the
' value of its integer parameter.
Function doubler(ByVal p As Integer) As Integer
Dim times2 = 2 * p
Console.WriteLine("Value of p: " & p)
Console.WriteLine("Double p: " & times2)
Return times2
End Function
' You can assign the function to the Sub delegate:
Dim d17 As Del3 = AddressOf doubler
' You can then call d17 like a regular Sub procedure.
d17(5)
' You cannot call d17 as a function. It is a Sub, and has no
' return value.
' Not valid.
'Console.WriteLine(d17(5))