|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
24.6.1. DelegatesDelegate instanties kunnen een methodpointer bevatten.
(1) delegate1 van type SomeDelegate wijst naar method SomeFunction. (2) Idem als (1), maar verkorte notatie voor SomeDelegate objectinitializer. (3) delegate3 van type SomeDelegate ( door local type inference ), wijst naar method SomeFunction. (4) delegate4 van type Func(Of Integer, Integer) wijst naar method SomeFunction. (5) Idem als (4), maar met verkorte notatie voor Func(Of Integer, Integer) objectinitializer. (6) delegate6 van type Func(Of Integer, Integer) ( door local type inference ), wijst naar method SomeFunction. Visual Basic 2010 Broncode Option Infer OnOption Strict OnPublic Class Example1 Public Delegate Function SomeDelegate( ByVal value As Integer) As Integer Public Shared Sub Main() Dim value1 As Integer Dim delegate1 As SomeDelegate = _ New SomeDelegate( AddressOf SomeFunction) value1 = delegate1.Invoke(5) Console.WriteLine(value1) Dim delegate2 As SomeDelegate = AddressOf SomeFunction value1 = delegate2.Invoke(5) Console.WriteLine(value1) Dim delegate3 = New SomeDelegate( AddressOf SomeFunction) value1 = delegate3.Invoke(5) Console.WriteLine(value1) Dim delegate4 As Func( Of Integer, Integer) = _ New Func( Of Integer, Integer)( AddressOf SomeFunction) value1 = delegate4.Invoke(5) Console.WriteLine(value1) Dim delegate5 As Func( Of Integer, Integer) = _ AddressOf SomeFunction value1 = delegate5.Invoke(5) Console.WriteLine(value1) Dim delegate6 = _ New Func( Of Integer, Integer)( AddressOf SomeFunction) value1 = delegate6.Invoke(5) Console.WriteLine(value1) Console.ReadLine() End Sub Public Shared Function SomeFunction( ByVal value As Integer) As Integer SomeFunction = value * 2 End FunctionEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 10
10
10
10
10
10 Type SomeDelegate was opzich overbodig, gezien we objecten kunnen maken van generische instanties van Func(Of T, TResult).
Zie het topic over delegates voor meer details over typesafe methodpointers. boven
24.6.2. Lambda ExpressionsHet is nu ook mogelijk een "lambda expression" te gebruiken overal waar een delegate instantie word verwacht ( met uitzondering van een RemoveHandler statement ).
In dergelijke expressie wordt de functie gedefinieerd. Deze definitie wordt gevormd door het keyword Function, gevolgd door de argumentenlijst, gevolgd door de expressie die de terugkeerwaarde voorstelt. Visual Basic 2010 Broncode Public Class Example2 Public Shared Sub Main() Dim value1 As Integer Dim delegate1 As Example1. SomeDelegate = _ Function(value As Integer) value * 2 value1 = delegate1.Invoke(5) Console.WriteLine(value1) Dim delegate2 As Func( Of Integer, Integer) = _ Function(value As Integer) value * 2 value1 = delegate2.Invoke(5) Console.WriteLine(value1) Dim delegate3 = Function(value As Integer) value * 2 value1 = delegate3.Invoke(5) Console.WriteLine(value1) value1 = ( Function(value As Integer) value * 2).Invoke(5) Console.WriteLine(value1) Console.WriteLine(( Function(value As Integer) value * 2).Invoke(5)) Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 10
10
10
10
10 (1) delegate1 van type SomeDelegate wijst naar de daar gedefinieerde lambda function. (2) delegate2 van type Func(Of Integer, Integer) wijst naar de daar gedefinieerde lambda function. (3) delegate3 van een anoniem delegatetype, wijst naar de daar gedefinieerde lambda function.
Zie het topic anonymous types voor meer details over anonieme types. boven
24.6.3. Definities en Implementaties van Lambda FunctionsDe body van de functie bestaat steeds enkel uit een expressie die de returnwaarde voorstelt.
Het returntype van de functie wordt bepaald via type inference. Op basis van de expressie die de terugkeerwaarde voorstelt, wordt het returntype bepaald.
De types van alle argumenten wordt bepaald via een expliciete As clausule of worden via type inference bepaald ( althans wanneer dit mogelijk is ). In de lambda expressions op regels (1) en (2) mag de type specifier van het argument value worden weggelaten, daar kan het type afgeleid worden van het datatype van value van SomeDelegate (1) en van het datatype van T van een generische instantie van Func(Of T, TResult) (2). Op regel (3) mag ( bij Option Strict On ) de type specifier van het argument value niet worden weggelaten, het type van deze parameter kan nergens van worden afgeleid.
Keywords Paramarray en Optional en generieke argumenten mogen niet worden gebruikt in een lambda function.
Modifiers als Overloads, Overridable, Overrides, ... kunnen niet gebruikt worden. boven
24.6.4. Nested Lambda ExpressionsLambda expressions kunnen genest worden. De functie waarnaartoe onderstaande delegate1 verwijst heeft als terugkeerwaarde een verwijzing naar de tweede functie.
De expressie delegate1.Invoke(2) bevat de verwijzing naar de tweede functie, die dan ook op zijn beurt geïnvokeerd wordt. Visual Basic 2010 Broncode Public Class Example4 Public Shared Sub Main() Dim delegate1 = Function(arg1 As Integer) _ Function(arg2 As Integer) arg1 - arg2 Dim value1 As Integer = delegate1.Invoke(2).Invoke(3) Console.WriteLine(value1) Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output -1 Eerst wordt de functie met argument arg1 geïnvokeerd, deze levert de verwijzing op naar de tweede functie (met argument arg2), die vervolgens wordt geïnvokeerd.
Bemerk hoe je in de body van de tweede functie probleemloos kunt gebruik maken van het argument arg1 dat in scope is gebracht door de eerste functie. boven
24.6.5. Relaxed Delegates en Lambda ExpressionsDelegate instanties hoeven niet perse te wijzen naar methods met exact dezelfde signatuur als het delegatetype definieert.
Daardoor kan in onderstaand voorbeeld delegate1 van type SomeDelegate ( die normaal gezien wijst naar een functie met een Integer argument ) hier ook wijzen naar een functie zonder argumenten.
Voor meer details over relaxed delegates, zie het desbetreffende topic.
delegate2 van type SomeDelegate ( die normaal gezien wijst naar een functie die een Integer waarde oplevert ) kan hier ook wijzen naar een functie die een waarde oplevert van een type die omzetbaar is naar Integer. Gezien de functie hier een Short waarde oplevert, en Short naar Integer widening conversie is, wordt dit toegestaan onder Option Strict On. Conversie van Long naar Integer is narrowing conversie waardoor regel (1) enkel wordt toegestaan onder Option Strict Off.
delegate4 van type SomeDelegate ( die normaal gezien wijst naar een functie met een Integer argument ) kan hier ook wijzen naar een functie met een argument van een type waarnaartoe Integer omzetbaar is. Gezien de functie hier werkt met een argument van type Long, en Integer naar Long widening conversie is, wordt dit toegestaan onder Option Strict On. Conversie van Integer naar Short is narrowing conversie waardoor regel (2) enkel wordt toegestaan onder Option Strict Off. Visual Basic 2010 Broncode Public Class Example5 Public Delegate Function SomeDelegate( ByVal value As Integer) As Integer Public Shared Sub Main() Dim delegate1 As SomeDelegate = Function() 1 Console.WriteLine(delegate1.Invoke(123)) Dim delegate2 As SomeDelegate = Function() 2S Console.WriteLine(delegate2.Invoke(123)) Dim delegate4 As SomeDelegate = Function(value As Long) 4 Console.WriteLine(delegate4.Invoke(123)) Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 1
2
4
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|