Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Greenpeace
Una panoramica delle specifiche C# 3.0 (5/5)
Scritto da Paolo De Nictolis il 26-01-2007 ore 08:57
Intel Parallel Studio XE
Il procedimento di conversione, di cui si è accennato nell'articolo precedente, gode della massima flessibilità: ad esempio, i metodi del pattern possono essere implementati come metodi di istanza o di estensione – giacchè entrambi hanno la medesima sintassi di invocazione – ed i metodi possono richiedere delegati o expression tree, dato che, come abbiamo visto, le lambda expression possono essere convertite ad entrambi. Il vantaggio di tutto ciò? Immaginate di poter fare, sempre naturalmente da codice C#, tutto questo:
  1. from o in orders
  2. let t = o.Details.Sum(d => d.UnitPrice * d.Quantity)
  3. where t >= 1000
  4. select new {o.OrderID, Total = t};
  5.  
  6. from c in customers
  7. from o in c.Orders
  8. orderby o.Total descending
  9. select new {c.Name, o.OrderID, o.Total};
  10.  
  11. from c in customers
  12. join o in orders on c.CustomerID equals o.CustomerID
  13. join d in details on o.OrderID equals d.OrderID
  14. join p in products on d.ProductID equals p.ProductID
  15. select new {c.Name, o.OrderDate, p.ProductName};

Infine, avendone parlato più volte, è bene spendere due parole sugli expression tree che consentono, in sostanza, di rappresentare una lambda expression come una struttura dati invece che come codice eseguibile. Per la precisione, una lambda expression, che può essere convertita ad un tipo delegato D, è convertibile anche ad un expression tree di tipo
  1. System.Query.Expression
. E' importante capire la differenza profonda fra le due conversioni: nel primo caso, viene generato del codice eseguibile, referenziato dal delegato; nel secondo, il codice, che rappresenta l'istanza di un expression tree, viene creato tramite
  1. System.Reflection.Emit
. Il vantaggio è che un expression tree è una rappresentazione in-memory di una lambda expression, efficiente, trasparente ed esplicita.

Un esempio dei due tipi di conversione è il seguente:
  1. Func<int,int> f = x => x + 1 			||Codice
  2. Expression<Func<int,int>> e = x => x + 1 	||Dati

ove, dato che esiste una conversione a
  1. Func<int,int>
, ne esiste anche una a
  1. Expression<Func<int,int>>
. Nel caso in esame, il delegato
  1. f
referenzia un metodo che restituisce x + 1, mentre l'expression tree
  1. e
referenzia una struttura dati in memoria che descrive l'espressione x + 1. Sia la struttura degli expression tree, che gli operatori standard per le query expression saranno descritti in specifiche separate. Da ultimo, vorrei ricordare che è disponibile per il download un video che mostra le principali novità di C# 3.0 in azione.
Precedente: Dekart Private Disk Multifactor, un innovativo software di cifratura (1/2)
Successiva: Fobs e i filmati in NetBeans
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.358 secondi.