Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Un approccio diverso per capire le espressioni lambda in Visual Basic

Tempo fa mi colpì una frase di Lisa Feigenbaum, del Visual Basic Team, che riassumeva in modo perfetto l’utilizzo delle espressioni lambda in Visual Basic. Secondo tale affermazione, è possibile utilizzare le lambda ogni qual volta ci sia necessità di un delegate. Prendo quindi spunto da tale affermazione per cercare di fornire un approccio diverso alla comprensione delle lambda in Visual Basic 2008/2010.

 

Partiamo da un banale frammento di codice, una sorta di query che ottiene, dall’elenco dei processi attivi sul sistema, solo quelli il cui nome inizia con la lettera “e”:

 

Dim filteredProcessList = Process.GetProcesses.Where(Function(p) _

                          p.ProcessName.ToLowerInvariant.StartsWith("e"))

 

Il metodo extension Where accetta una lambda che si pone in essere tramite la keyword Function, grazie alla quale si può valutare se il nome di ciascun processo inizi con la lettera “e” e, se True, l’oggetto Process confluisce nella IEnumerable(Of Process) finale.

 

Il codice sopra esposto, riprendendo l’affermazione iniziale, potrebbe essere riscritto in questo modo:

 

Dim filteredProcessList = Process.GetProcesses.Where(AddressOf EvaluateProcess)

 

Private Function EvaluateProcess(ByVal p As Process) As Boolean

    If p.ProcessName.ToLowerInvariant.StartsWith("e") Then Return True

End Function

 

E’ più chiaro ora cosa fa la lambda? In sostanza il metodo EvaluateProcess rispetta la signature del delegate che va passato al metodo Where e riceve come argomento l’oggetto Process da elaborare e restituisce, come Boolean, il risultato della valutazione. Poiché il compilatore Visual Basic sa il fatto suo, potremmo scrivere un metodo identico cambiando solo l’argomento ricevuto, che poi corrisponde al singolo oggetto della sequenza da valutare (in questo caso Process, ma poteva essere Integer per esempio).

 

Il compilatore permette un altro passaggio. Where (ma non solo lui, ovviamente) richiede un argomento di tipo Func(Of T, Boolean). Tale tipo, in sostanza, rappresenta un delegate di cui la lambda expression rispetta la signature. T è il tipo da valutare, Boolean è il risultato vero o falso ottenuto.

 

Possiamo quindi scrivere il codice in un ulteriore modo, sempre esplicito, un po’ più .NET 3.5/4.0 – oriented:

 

Dim pred As New System.Func(Of Process, Boolean)(AddressOf EvaluateProcess)

Dim filteredProcessList = Process.GetProcesses.Where(pred)

 

Private Function EvaluateProcess(ByVal p As Process) As Boolean

    If p.ProcessName.ToLowerInvariant.StartsWith("e") Then Return True

End Function

 

Qui specifichiamo esplicitamente il tipo su cui lavoriamo (Process) e il metodo che esegue la valutazione, che rimane lo stesso precedente. Sfruttando inferenza del tipo e lambda expression, il compilatore Visual Basic consente di trasformare tutto il il codice sopra citato nel modo con cui abbiamo iniziato, che è il seguente:

 

Dim filteredProcessList = Process.GetProcesses.Where(Function(p) _

                          p.ProcessName.ToLowerInvariant.StartsWith("e"))

 

Se siete curiosi e volete provare tutti e tre gli snippet, otterrete sempre lo stesso risultato, con la differenza che la lambda expression ha reso il nostro codice decisamente più snello. E forse ora ne sappiamo qualcosa in più.

 

Alessandro

Print | posted on giovedì 27 agosto 2009 22:37 | Filed Under [ Visual Basic ]

Powered by:
Powered By Subtext Powered By ASP.NET