In Visual Basic 10 è possibile definire delle lambda expression su più linee.
In sostanza si tratta di funzioni definite “in-line” che possono estendersi anche su più linee.
Un esempio di ciò che si intende è il seguente:
- Dim intList = {1, 4, 7, 3, 8, 2, 5, 9, 0}
- Dim query = Array.FindAll(intList,
- Function(x)
- Dim retVal As Boolean = False
- If x > 6 Then
- retVal = True
- Else
- If x \ 2 = 1 Then
- Return True
- End If
- End If
- Return retVal
- End Function)
Le lambda expression multilinea possono essere sia Function che Sub.
E’ possibile utilizzare le lambda expression multilinea anche per assegnare dei gestori di eventi “al volo”:
- AddHandler Me.Button2.Click, Sub()
- MessageBox.Show("Ciao")
- End Sub
Come si comporta, però, il compilatore quando utiliziamo questa nuova funzionalità del linguaggio.
Compiliamo la seguente classe:
- Public Class Class1
- Private Sub Main()
- Dim intList = {1, 4, 7, 3, 8, 2, 5, 9, 0}
- Dim query = Array.FindAll(intList,
- Function(x)
- Dim retVal As Boolean = False
- If x > 6 Then
- retVal = True
- Else
- If x \ 2 = 1 Then
- Return True
- End If
- End If
- Return retVal
- End Function)
- End Sub
- End Class
ed analizziamo il risultato della compilazione con Reflector di Red Gate, otteniamo:
Come possiamo osservare il compilatore genera un metodo statico chiamato _Lambda$__1 in cui inserisce il codice presente nella lambda multilinea (tra le altre cose ottimizzato togliendo l’IF).
Questo ci dice che creare delle lambda multilinea non è diverso che creare un metodo che esegue lo stesso algoritmo. Non si ha, in questo caso, una ottimizzazione nell’uso delle lambda multilinea.
Commenti