Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A lazított delegált konverzió lehetővé teszi az eljárások és függvények hozzárendelését a delegáltakhoz vagy kezelőkhöz még akkor is, ha az aláírásuk nem azonos. Ezért a meghatalmazottakhoz való kötés konzisztenssé válik a metódushívásokhoz már engedélyezett kötéssel.
Paraméterek és visszatérési típus
A pontos aláírás-egyeztetés helyett az enyhített átalakításhoz a következő feltételek teljesülése szükséges, amikor a Option StrictOn-re van állítva:
Az egyes delegált paraméterek adattípusától a hozzárendelt függvény vagy
Subfüggvény megfelelő paraméterének adattípusához szélesítő átalakításnak kell léteznie. Az alábbi példában a meghatalmazottnakDel1egy paramétere van, egyInteger. A hozzárendelt lambdakifejezésekmparaméterének olyan adattípusnak kell lennie, amelyre létezik szélesítő átalakítás aIntegerirányából, példáulLongvagyDouble.' 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) 3A konvertálások szűkítése csak akkor engedélyezett, ha
Option Strictbe van állítvaOff.' 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) mA kiszélesítő átalakításnak a hozzárendelt függvény visszatérési típusától vagy
Suba meghatalmazott visszatérési típusától ellentétes irányban kell léteznie. Az alábbi példákban az egyes hozzárendelt lambdakifejezések törzsét olyan adattípusra kell kiértékelniInteger, amely a visszatérésidel1Integertípus miatt szélesedik.' 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)
Ha Option Strict be van állítva Off, a szélesítési korlátozás mindkét irányban megszűnik.
' 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)
A paraméterspecifikációk kihagyása
A rugalmas delegáltak lehetővé teszik, hogy teljesen kihagyja a paraméter-specifikációkat a hozzárendelt metódusban.
' 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))
Vegye figyelembe, hogy nem adhat meg paramétereket, és nem hagyhat ki másokat.
' Not valid.
'Dim d12 As Del2 = Function(p As Integer) p
A paraméterek kihagyásának lehetősége olyan helyzetekben hasznos, mint például egy eseménykezelő definiálása, amelyben több összetett paraméter is szerepel. Egyes eseménykezelők argumentumai nem használhatók. Ehelyett a kezelő közvetlenül hozzáfér annak a vezérlőelemnek az állapotához, amelyen az esemény regisztrálva van, és figyelmen kívül hagyja az argumentumokat. A lazított delegáltak lehetővé teszik, hogy az ilyen deklarációkból kihagyja az argumentumokat, ha nem keletkezik kétértelműség. Az alábbi példában a teljes mértékben megadott metódus OnClick újraírható 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 - példa példák
Az előző példákban lambda kifejezéseket használunk a típuskapcsolatok egyszerű megjelenítéséhez. Ugyanakkor ugyanazok a lazítások engedélyezettek a delegált hozzárendelések esetében, amelyek AddressOf, Handles vagy AddHandler használatával történnek.
Az alábbi példában a függvények f1, f2, f3 és f4 mind hozzárendelhetők Del1-hoz.
' 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
Az alábbi példa csak akkor érvényes, ha Option Strict be van állítva.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))
A függvény eredményének elvetése
A rugalmas delegát konverzió lehetővé teszi, hogy függvényt rendeljen egy Sub delegáthoz, és nem veszi figyelembe a függvény visszatérési értékét. Azonban nem rendelhet hozzá Sub egy függvénydelegálthoz. Az alábbi példában a(z) doubler függvény címét a Sub delegáltnak Del3 rendeljük hozzá.
' 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))