4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
Extension methods
Gli extension methods sono metodi speciali che permettono di estendere una classe e di essere invocati come se fossero metodi di istanza. In .NET, questi metodi sono statici (shared) marcati con l'attributo Extension e definiti in classi statiche (moduli in VB) che non dispongono quindi di una particolare istanza, ma ricevono l'oggetto che vogliono estendere come primo parametro di una funzione.
Se vogliamo per esempio avere un metodo per formattare le letture maiuscole di ogni parola di una stringa, possiamo dichiarare un modulo di estensioni dal nome libero:
Module StringExtensions
' Attributo System.Runtime.CompilerServices.ExtensionAttribute
<Extension()> _
Public Function ToTitleCase(ByVal s As String) As String
Return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower())
End Function
End ModuleE' importante marcare la funzione con l'attributo Extension (in C# 3.0 esiste una parola chiave apposita) e accettare come parametro il tipo che si vuole estendere, più eventuali altri parametri che vogliamo passare al metodo. Per utilizzare quel metodo basta che il modulo sia visibile (aggiungendo quindi la referenza e utilizzando Imports per includere il namespace nel quale è contenuto) e chiamare il metodo come se fosse di istanza:
Dim s = "hello aspitalia.com"
' Equivale a StringExtensions.ToTitleCase(s)
s = s.ToTitleCase() ' Diventa Hello Aspitalia.comGli extension methos sono quindi molto comodi e di facile utilizzo, ma dobbiamo stare attenti a come si dichiarano. Innanzitutto sebbene "estendano" una classe non abbiamo alcuni visibilità sui membri privati e protetti, poiché dobbiamo ricordarci che tali metodi sono contenuti in classi esterne. Inoltre, in presenza di più metodi con lo stesso nome vince chi accetta il parametro più specifico e vicino al tipo della variabile. Nel caso in cui il compilatore trovi più metodi specifici con la medesima firma, riceveremo un errore di compilazione.
Lambda expressions
L'intero .NET Framework fa largo uso di eventi per il funzionamento delle classi e dell'intera logica dell'applicazione. Gli eventi si basano su delegate: puntatori a funzioni che possono essere mantenuti in variabili per essere invocati uno o più volte. Normalmente in VB usiamo la parola chiave AddressOf per creare un delegate e facoltativamente indichiamo il tipo (EventHandler, CancelEventHandler, ecc) per poi essere associato all'evento mediante gli statement AddHandler e RemoveHandler. Alcuni metodi come per esempio Find della classe List(Of T) accettano un delegate ad una funzione che, dato l'oggetto, ritorni un valore booleano per indicare se è stato trovato l'oggetto. Ecco come con VB 8 sfruttiamo questo metodo per individuare per esempio le stringhe vuote:
Sub Test()
Dim list As New List(Of String)
Dim m As Predicate(Of String) = AddressOf FindZeroLength
' Uso normale del delegate
Dim i = list.FindIndex(m)
End Sub
Function FindZeroLength(ByVal s As String) As Boolean
Return s.Length = 0
End FunctionCapita spesso che queste funzioni siano semplici, ma il codice da scrivere resta comunque molto. Le lambda expressions permettono di compattare e scrivere inline direttamente una sola espressione ritornando un valore. Questo lo otteniamo con la parola chiave Function e dichiarando i parametri che intendiamo accettare in accordo con il delegate che si vuole creare. Ecco quindi come possiamo compattare il codice in precedenza creato:
Dim list As New List(Of String)
Dim m2 As Predicate(Of String) = Function(s As String) s.Length = 0
' Uso della lambda expression come delegate salvato in una variabile
Dim i2 = list.FindIndex(m2)
' Uso della lambda expression inline. "As String" può essere omesso
Dim i3 = list.FindIndex(Function(s As String) s.Length = 0)La comodità delle lambda expression non sta solo nella compattezza del codice e nella facilità di lettura, ma anche dalla possibilità che abbiamo di utilizzare nella funzione le variabili presenti nello stack chiamante, il tutto mediante un meccanismo di classi annidate autogenerate dal compilatore in modo trasparente.
4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>
Contenuti dell'articolo
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Utilità

Stampa
Download 


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
