Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

24.6. Lambda Expressions

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

24.6.1. Delegates

Delegate 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 2012 Broncode - Codevoorbeeld 648
Option Infer On
Option Strict On
Public 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) ' (1)
        value1 = delegate1.Invoke(5)
        Console.WriteLine(value1)
        '
        Dim delegate2 As SomeDelegate = AddressOf SomeFunction             ' (2)
        value1 = delegate2.Invoke(5)
        Console.WriteLine(value1)
        '
        Dim delegate3 = New SomeDelegate(AddressOf SomeFunction)           ' (3)
        value1 = delegate3.Invoke(5)
        Console.WriteLine(value1)
        '
        Dim delegate4 As Func(Of Integer, Integer) = _
                     New Func(Of Integer, Integer)(AddressOf SomeFunction) ' (4)
        value1 = delegate4.Invoke(5)
        Console.WriteLine(value1)
        '
        Dim delegate5 As Func(Of Integer, Integer) = _
                                                    AddressOf SomeFunction ' (5)
        value1 = delegate5.Invoke(5)
        Console.WriteLine(value1)
        '
        Dim delegate6 = _
                     New Func(Of Integer, Integer)(AddressOf SomeFunction) ' (6)
        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 Function
End Class
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.

24.6.2. Lambda Expressions

Het 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 2012 Broncode - Codevoorbeeld 649
Public Class Example2
    Public Shared Sub Main()
        Dim value1 As Integer
        '
        Dim delegate1 As Example1.SomeDelegate = _
                                      Function(value As Integer) value * 2 ' (1)
        value1 = delegate1.Invoke(5)
        Console.WriteLine(value1)
        '
        Dim delegate2 As Func(Of Integer, Integer) = _
                                      Function(value As Integer) value * 2 ' (2)
        value1 = delegate2.Invoke(5)
        Console.WriteLine(value1)
        '
        Dim delegate3 = Function(value As Integer) value * 2               ' (3)
        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 Sub
End Class
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.

24.6.3. Definities en Implementaties van Lambda Functions

De 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.

24.6.4. Nested Lambda Expressions

Lambda 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 2012 Broncode - Codevoorbeeld 650
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 Sub
End Class
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.

24.6.5. Relaxed Delegates en Lambda Expressions

Delegate 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.

Variabele 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.

Variabele 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 2012 Broncode - Codevoorbeeld 651
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 delegate3 As SomeDelegate = Function() 3L                     ' (1)
        '
        Dim delegate4 As SomeDelegate = Function(value As Long) 4
        Console.WriteLine(delegate4.Invoke(123))
        '
        'Dim delegate5 As SomeDelegate = Function(value As Short) 5        ' (2)
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
1
2
4

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.