lunedì 21 dicembre 2009

VS2010 – VB.NET : Multiline lambda expression

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:

  1. Dim intList = {1, 4, 7, 3, 8, 2, 5, 9, 0}
  2.  
  3. Dim query = Array.FindAll(intList,
  4.                           Function(x)
  5.                               Dim retVal As Boolean = False
  6.                               If x > 6 Then
  7.                                   retVal = True
  8.                               Else
  9.                                   If x \ 2 = 1 Then
  10.                                       Return True
  11.                                   End If
  12.                               End If
  13.                               Return retVal
  14.                           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”:

  1. AddHandler Me.Button2.Click, Sub()
  2.                                  MessageBox.Show("Ciao")
  3.                              End Sub

Come si comporta, però, il compilatore quando utiliziamo questa nuova funzionalità del linguaggio.

Compiliamo la seguente classe:

  1. Public Class Class1
  2.  
  3.     Private Sub Main()
  4.         Dim intList = {1, 4, 7, 3, 8, 2, 5, 9, 0}
  5.  
  6.         Dim query = Array.FindAll(intList,
  7.                                   Function(x)
  8.                                       Dim retVal As Boolean = False
  9.                                       If x > 6 Then
  10.                                           retVal = True
  11.                                       Else
  12.                                           If x \ 2 = 1 Then
  13.                                               Return True
  14.                                           End If
  15.                                       End If
  16.                                       Return retVal
  17.                                   End Function)
  18.     End Sub
  19.  
  20. End Class

ed analizziamo il risultato della compilazione con Reflector di Red Gate, otteniamo:

reflector

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.

Nessun commento: