Le specifiche di
C# 3.0 sono state rilasciate sin da maggio 2006, in una
versione per la community aperta alla discussione, e come capitolo aggiuntivo - il 26esimo - di una trentina di pagine, alle
specifiche attuali. Molte delle novità riguardano, naturalmente,
LINQ - l'insieme di estensioni a C# che consentirà di effettuare query alle sorgenti dati direttamente dal linguaggio, eliminando il conflitto d'impedenza fra codice e DBMS o store dati generico, fra cui XML - ed i suoi componenti:
lambda expressions,
query expressions ed
expression trees. Ma procediamo con ordine. Innanzitutto, le estensioni proposte sono totalmente compatibili con C# 2.0, e mirano a supportare la creazione di librerie di classi che seguano il paradigma della
programmazione funzionale.
Oltre a quelle per LINQ già citate, le estensioni comprendono: variabili locali
implicitly typed, ovvero il cui tipo può essere inferito dalle espressioni usate per inizializzarle; metodi per l'estensione dei tipi attuali con nuovi metodi e per la creazione di nuovi tipi;
inizializzatori di oggetto -
object initializers - che facilitano la creazione e l'inizializzazione di oggetti; tipi anonimi, collegati agli inizializzatori di oggetto; array
implicitamente tipati, che inferiscono anch'essi il tipo da appositi
array initializer. Ognuno dei
topic delle specifiche richiede, naturalmente, qualche esempio. Cominciamo con le variabili locali
implicitamente tipizzate: si tratta di un meccanismo, analogo a quello usato da PHP, che inferisce il tipo di una variabile – genericamente dichiarata con la parola chiave
– a partire dal suo valore; così per esempio il compilatore del prossimo Visual Studio – il già ben noto
Orcas – tratterà le seguenti dichiarazioni:
var i = 5;
var s = “Mustang: dead before born”;
var d = 1.0;
var numbers = new int[] {1, 2, 3};var orders = new Dictionary<int,Order<();
come se nel codice fosse stato scritto:
int i = 5;
string s = “Mustang: dead before born”;
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};Dictionary<int,Order> orders = new Dictionary<int,Order>();
Naturalmente, questa caratteristica è soggetta ad alcune restrizioni oltre a quella, ovvia, dell'inizializzazione della variabile - non potremo in alcun modo scrivere un semplice
: l'inizializzatore deve essere un'espressione - non può essere un oggetto o una
Collection -; il suo tipo a tempo di compilazione non può essere
; e se si inizializzano più variabili contemporaneamente, queste devono avere lo stesso tipo a compilazione: in parole povere, è illegale una dichiarazione del tipo:
|| genera un errore a compile-time
var iCounter, sGreeting, arrMonths = 1, “Hello P.it people!”, new string[] {“Gennaio”, “Febbraio”, “Marzo”};