Cronologia di C#
Questo articolo include la cronologia di ogni versione principale del linguaggio C#. Il team di C# continua a innovare il prodotto e ad aggiungere nuove funzionalità. Informazioni dettagliate sullo stato delle funzionalità del linguaggio, include le funzionalità prese in considerazione per versioni future, sono reperibili nel repository dotnet/roslyn su GitHub.
Importante
Per alcune funzionalità, il linguaggio C# si basa sui tipi e metodi inclusi in quella che la specifica C# definisce la libreria standard. La piattaforma .NET rende disponibili questi tipi e metodi in numerosi pacchetti. Un esempio è l'elaborazione delle eccezioni. Ogni istruzione o espressione throw
viene controllata per assicurarsi che l'oggetto generato derivi da Exception. Analogamente, ogni istruzione catch
viene controllata per verificare che il tipo intercettato derivi da Exception. In ogni versione potrebbero essere aggiunti nuovi requisiti. Per usare le funzionalità del linguaggio più recenti in ambienti meno recenti, potrebbe essere necessario installare librerie specifiche. Queste dipendenze sono documentate nella pagina per ogni versione specifica. Le informazioni sulle relazioni tra linguaggio e libreria possono essere utili per comprendere meglio questa dipendenza.
C# versione 11
Data di rilascio: novembre 2022
In C# 11 sono state aggiunte le funzionalità seguenti:
- Valori letterali stringa non elaborati
- Supporto matematico generico
- Attributi generici
- Valori letterali stringa UTF-8
- Nuove righe nelle espressioni di interpolazione di stringhe
- Modelli di elenco
- Tipi locali di file
- Membri obbligatori
- Struct predefiniti automaticamente
Span<char>
Corrispondenza dei criteri in una costantestring
- Ambito esteso
nameof
- IntPtr numerico
ref
campi escoped ref
- Miglioramento della conversione del gruppo di metodi in delegato
- Onda di avviso 7
C# 11 introduce matematica generica e diverse funzionalità che supportano tale obiettivo. È possibile scrivere algoritmi numerici una sola volta per tutti i tipi di numeri. Sono disponibili altre funzionalità per semplificare l'uso dei struct
tipi, ad esempio i membri obbligatori e gli struct predefiniti automatici. L'uso delle stringhe risulta più semplice con i valori letterali stringa non elaborati, la nuova riga nelle interpolazioni di stringhe e i valori letterali stringa UTF-8. Funzionalità come i tipi locali di file consentono ai generatori di origine di essere più semplici. Infine, i modelli di elenco aggiungono ulteriore supporto per i criteri di ricerca.
C# versione 10
Data di rilascio: novembre 2021
C# 10 aggiunge le funzionalità e i miglioramenti seguenti al linguaggio C#:
- Struct di record
- Miglioramenti dei tipi di struttura
- Gestori di stringhe interpolati
global using
Direttive- Dichiarazione dello spazio dei nomi con ambito file
- Modelli di proprietà estesi
- Miglioramenti delle espressioni lambda
- Consenti
const
stringhe interpolate - I tipi di record possono essere sigillati
ToString()
- Assegnazione definita migliorata
- Consenti sia l'assegnazione che la dichiarazione nella stessa decostruzione
- Consenti
AsyncMethodBuilder
attributo per i metodi - Attributo CallerArgumentExpression
- Pragma avanzato
#line
Altre funzionalità erano disponibili in modalità anteprima . Per usare queste funzionalità, è necessario impostare su <LangVersion>
Preview
nel progetto:
- Attributi generici più avanti in questo articolo.
- membri astratti statici nelle interfacce
C# 10 continua a lavorare su temi di rimozione della cerimonia, separazione dei dati dagli algoritmi e miglioramento delle prestazioni per .NET Runtime.
Molte delle funzionalità indicano che si digita meno codice per esprimere gli stessi concetti. Gli struct di record sintetizzano molti degli stessi metodi che registrano le classi . Gli struct e i tipi anonimi supportano le espressioni. Le direttive using globali e le dichiarazioni dello spazio dei nomi con ambito file indicano che le dipendenze e l'organizzazione dello spazio dei nomi sono più chiaramente espresse. I miglioramenti dell'espressione lambda semplificano la dichiarazione di espressioni lambda in cui vengono usate. I nuovi modelli di proprietà e i miglioramenti della decostruzione creano codice più conciso.
I nuovi gestori di stringhe interpolati e AsyncMethodBuilder
il comportamento possono migliorare le prestazioni. Queste funzionalità del linguaggio sono state applicate in .NET Runtime per ottenere miglioramenti delle prestazioni in .NET 6.
C# 10 segna anche un ulteriore passaggio alla cadenza annuale per le versioni .NET. Poiché non tutte le funzionalità possono essere completate in un intervallo di tempo annuale, è possibile provare un paio di funzionalità di "anteprima" in C# 10. È possibile usare sia gli attributi generici che i membri astratti statici nelle interfacce , ma queste funzionalità di anteprima possono cambiare prima della versione finale.
C# versione 9
Data di rilascio: novembre 2020
C# 9 è stato rilasciato con .NET 5. È la versione del linguaggio predefinita per qualsiasi assembly destinato alla versione .NET 5. Contiene le funzionalità nuove e avanzate seguenti:
- Record
- Setter di sola inizializzazione
- Istruzioni di primo livello
- Miglioramenti dei criteri di ricerca
- Prestazioni e interoperabilità
- Caratteristiche di adattabilità e finitura
- Supporto per i generatori di codice
C# 9 continua tre dei temi delle versioni precedenti: la rimozione della cerimonia, la separazione dei dati dagli algoritmi e la fornitura di più modelli in più posizioni.
Le istruzioni di primo livello significa che il programma principale è più semplice da leggere. C'è meno bisogno di cerimonia: uno spazio dei nomi, una Program
classe e static void Main()
non sono tutti necessari.
L'introduzione di fornisce una sintassi concisa per i tipi di records
riferimento che seguono la semantica dei valori per l'uguaglianza. Questi tipi verranno usati per definire i contenitori di dati che definiscono in genere un comportamento minimo. I setters solo init forniscono la funzionalità per le mutazioni non distruttive (with
espressioni) nei record. C# 9 aggiunge anche tipi restituiti covariante in modo che i record derivati possano eseguire l'override dei metodi virtuali e restituire un tipo derivato dal tipo restituito del metodo di base.
Le funzionalità di corrispondenza dei modelli sono state espanse in diversi modi. I tipi numerici supportano ora i modelli di intervallo. I modelli possono essere combinati usando and
, or
e not
modelli. Le parentesi possono essere aggiunte per chiarire modelli più complessi.
Un altro set di funzionalità supporta l'elaborazione ad alte prestazioni in C#:
- I
nint
tipi enuint
modellare i tipi integer di dimensioni native nella CPU di destinazione. - I puntatori alle funzioni forniscono funzionalità simili al delegato evitando le allocazioni necessarie per creare un oggetto delegato.
- L'istruzione
localsinit
può essere omessa per salvare le istruzioni.
Un altro set di miglioramenti supporta scenari in cui i generatori di codice aggiungono funzionalità:
- Gli inizializzatori del modulo sono metodi che il runtime chiama quando un assembly viene caricato.
- I metodi parziali supportano nuovi modificatori di accesso e tipi restituiti non void. In questi casi è necessario fornire un'implementazione.
C# 9 aggiunge molte altre funzionalità di piccole dimensioni che migliorano la produttività degli sviluppatori, sia la scrittura che la lettura del codice:
- Espressioni di tipo di destinazione
new
static
funzioni anonime- Espressioni condizionali di tipo di destinazione
- Supporto dell'estensione
GetEnumerator()
perforeach
i cicli - Le espressioni lambda possono dichiarare parametri di eliminazione
- Gli attributi possono essere applicati alle funzioni locali
La versione C# 9 continua il lavoro per mantenere C# un linguaggio di programmazione moderno per utilizzo generico. Le funzionalità continuano a supportare carichi di lavoro moderni e tipi di applicazioni.
C# versione 8.0
Data di rilascio: settembre 2019
C# 8.0 è la prima versione C# principale che punta in modo specifico a .NET Core. Alcune funzionalità si basano sulle nuove funzionalità CLR, altri sui tipi di libreria aggiunti solo in .NET Core. C# 8.0 aggiunge le funzionalità e i miglioramenti seguenti al linguaggio C#:
- Membri di sola lettura
- Metodi di interfaccia predefiniti
- Miglioramenti della corrispondenza dei modelli:
- Espressioni switch
- Criteri per le proprietà
- Criteri per le tuple
- Criteri per la posizione
- Uso delle dichiarazioni
- Funzioni locali statiche
- Struct ref Disposable
- Tipi riferimento nullable
- Flussi asincroni
- Indici e intervalli
- Assegnazione null-coalescing
- Tipi costruiti non gestiti
- Stackalloc nelle espressioni nidificate
- Miglioramento delle stringhe verbatim interpolate
I membri dell'interfaccia predefiniti richiedono miglioramenti in CLR. Queste funzionalità sono state aggiunte in CLR per .NET Core 3.0. Gli intervalli e gli indici e i flussi asincroni richiedono nuovi tipi nelle librerie .NET Core 3.0. I tipi di riferimento nullable, implementati nel compilatore, sono molto più utili quando le librerie vengono annotate per fornire informazioni semantiche sullo stato Null degli argomenti e sui valori restituiti. Tali annotazioni vengono aggiunte nelle librerie .NET Core.
C# versione 7.3
Data di rilascio: maggio 2018
Esistono due temi principali per C# versione 7.3. Un tema comprende funzionalità che consentono al codice gestito di offrire prestazioni altrettanto elevate di quelle del codice non gestito. Il secondo tema comprende miglioramenti incrementali delle funzionalità esistenti. In questa versione sono state aggiunte anche nuove opzioni del compilatore.
Le nuove funzionalità seguenti supportano il tema del miglioramento delle prestazioni per il codice gestito:
- È possibile accedere a campi fissi senza blocco.
- È possibile riassegnare le variabili locali
ref
. - È possibile usare gli inizializzatori nelle matrici
stackalloc
. - È possibile usare istruzioni
fixed
con qualsiasi tipo che supporta un modello. - È possibile usare vincoli più generici.
Sono stati apportati i miglioramenti seguenti alle funzionalità esistenti:
- È possibile testare
==
e!=
con i tipi di tupla. - È possibile usare le variabili di espressione in più posizioni.
- È possibile associare gli attributi al campo sottostante delle proprietà implementate automaticamente.
- È stata migliorata la risoluzione del metodo quando gli argomenti sono diversi da
in
. - La risoluzione dell'overload ora presenta un minor numero di casi ambigui.
Le nuove opzioni del compilatore sono le seguenti:
-publicsign
per abilitare la firma degli assembly con software open source.-pathmap
per fornire un mapping per le directory di origine.
C# versione 7.2
Data di rilascio: novembre 2017
C# 7.2 ha aggiunto diverse funzionalità del linguaggio di piccole dimensioni:
- Inizializzatori in
stackalloc
matrici. - Usare
fixed
istruzioni con qualsiasi tipo che supporti un modello. - Accedere ai campi fissi senza aggiungere.
- Riassegnare
ref
le variabili locali. - Dichiarare
readonly struct
i tipi, per indicare che uno struct non è modificabile e deve essere passato comein
parametro ai relativi metodi membro. - Aggiungere il
in
modificatore nei parametri per specificare che un argomento viene passato da riferimento ma non modificato dal metodo denominato. - Utilizzare il modificatore nel metodo restituisce, per indicare che un metodo restituisce il
ref readonly
relativo valore in base al riferimento, ma non consente le scritture in tale oggetto. - Dichiarare
ref struct
i tipi, per indicare che un tipo di struct accede direttamente alla memoria gestita e deve sempre essere allocato nello stack. - Usare vincoli generici aggiuntivi.
- Argomenti denominati non finali
- Gli argomenti denominati possono essere seguiti da argomenti posizionali.
- Caratteri di sottolineatura iniziali nei valori letterali numerici
- I valori letterali numerici possono ora includere caratteri di sottolineatura iniziali prima di qualsiasi cifra stampata.
private protected
modificatore di accesso- Il modificatore di accesso
private protected
consente l'accesso per le classi derivate nello stesso assembly.
- Il modificatore di accesso
- Espressioni condizionali
ref
- Il risultato di un'espressione condizionale (
?:
) può ora essere un riferimento.
- Il risultato di un'espressione condizionale (
C# versione 7.1
Data di rilascio: agosto 2017
C# ha iniziato a rilasciare le versioni dei punti con C# 7.1. Questa versione ha aggiunto l'elemento di configurazione della selezione della versione del linguaggio , tre nuove funzionalità del linguaggio e il nuovo comportamento del compilatore.
Le nuove funzionalità relative al linguaggio in questa versione sono:
async
Main
Metodo- Il punto di ingresso per un'applicazione può avere il modificatore
async
.
- Il punto di ingresso per un'applicazione può avere il modificatore
default
espressioni letterali- Quando è possibile dedurre il tipo di destinazione, si possono usare espressioni letterali predefinite nelle espressioni con valore predefinito.
- Nomi di elemento di tupla dedotti
- In molti casi i nomi degli elementi della tupla possono essere dedotti dall'inizializzazione tupla.
- Criteri di ricerca su parametri di tipo generico
- È possibile usare espressioni di criteri di ricerca sulle variabili in cui il tipo è un parametro di tipo generico.
Infine, il compilatore ha due opzioni -refout
e -refonly
tale generazione di assembly di riferimento al controllo
C# versione 7.0
Data di rilascio: marzo 2017
La versione C# 7.0 è stata rilasciata con Visual Studio 2017. Questa versione ha alcune cose evolutive e interessanti nella vena di C# 6.0. Ecco alcune delle nuove funzionalità:
- Variabili out
- Tuple e decostruzione
- Criteri di ricerca
- Funzioni locali
- Membri di espressioni corpo espansi
- Variabili locali ref
- Valori restituiti
Altre funzionalità:
- Variabili discard
- Valori letterali binari e separatori di cifre
- Espressioni throw
Tutte queste funzionalità offrono nuove funzionalità per gli sviluppatori e la possibilità di scrivere codice più pulito che mai. Una funzionalità di particolare rilievo è la possibilità di condensare la dichiarazione di variabili da usare con la parola chiave out
, consentendo più valori restituiti tramite tupla. .NET Core ora supporta qualsiasi sistema operativo ed è decisamente orientato al cloud e alla portabilità. Queste nuove capacità, insieme alla realizzazione di nuove funzionalità, tengono sicuramente impegnati i progettisti del linguaggio.
C# versione 6.0
Data di rilascio: luglio 2015
La versione 6.0, rilasciata con Visual Studio 2015, ha rilasciato molte funzionalità più piccole che hanno reso la programmazione C# più produttiva. Eccone alcuni:
- Importazioni statiche
- Filtri eccezioni
- Inizializzatori di proprietà automatiche
- Membri con corpo di espressione
- Propagazione Null
- Interpolazione di stringhe
- Operatore nameof
Le altre nuove funzionalità includono:
- Inizializzatori di indice
- Await nei blocchi catch e finally
- Valori predefiniti per le proprietà solo getter
Ognuna di queste funzionalità è interessante in sé, ma osservandole nel loro complesso si scopre uno schema interessante. In questa versione C# ha iniziato a eliminare il boilerplate del linguaggio per rendere il codice più leggibile e più terse. Per gli amanti della pulizia e della semplicità del codice, questa versione del linguaggio rappresenta una vittoria notevole.
Con questa versione è stata introdotta un'altra caratteristica, che di per sé non rappresenta una funzionalità tradizionale del linguaggio. È stato rilasciato Roslyn, il compilatore come servizio. Il compilatore C# è ora scritto in C# e può essere usato all'interno dei progetti di programmazione.
C# versione 5.0
Data di rilascio: agosto 2012
C# versione 5.0, rilasciata con Visual Studio 2012, era una versione mirata del linguaggio. Quasi tutto l'impegno per questa versione è stato indirizzato verso un altro concetto rivoluzionario: il modello async
e await
per la programmazione asincrona. Ecco l'elenco delle funzionalità principali:
- Membri asincroni
- Attributi informativi sul chiamante
- Progetto di codice: Attributi informativi sul chiamante in C# 5.0
Gli attributi informativi sul chiamante consentono di recuperare facilmente informazioni sul contesto di esecuzione senza dover ricorrere a una grande quantità di codice di reflection boilerplate. Questi attributi hanno molte applicazioni nelle attività di diagnostica e di registrazione.
Ma le vere stelle di questa versione sono async
e await
. Con il rilascio di queste funzionalità nel 2012, C# ha cambiato di nuovo le carte in tavola, incorporando l'asincronia nel linguaggio e assegnandole un ruolo fondamentale. Tutti coloro che hanno avuto a che fare con operazioni di lunga esecuzione e con l'implementazione di reti di callback hanno molto apprezzato questa funzionalità.
C# versione 4.0
Data di rilascio: aprile 2010
C# versione 4.0, rilasciata con Visual Studio 2010, avrebbe avuto un tempo difficile per raggiungere lo stato rivoluzionario della versione 3.0. Questa versione ha introdotto alcune nuove funzionalità interessanti:
- Associazione dinamica
- Argomenti denominati/facoltativi
- Covarianti e controvarianti generiche
- Tipi di interoperabilità incorporati
I tipi di interoperabilità incorporati hanno risolto il problema di distribuzione della creazione di assembly di interoperabilità COM per l'applicazione. Le covarianze e le controvarianze generiche offrono modalità più avanzate per l'uso dei generics, ma hanno un'aria accademica e sono probabilmente apprezzate soprattutto dagli autori di librerie e di framework. I parametri denominati e facoltativi consentono di eliminare molti overload di metodi e sono più comodi da usare. Ma nessuna di queste funzionalità è precisamente un modifica di paradigma.
La caratteristica principale è stata l'introduzione della parola chiave dynamic
. La parola chiave dynamic
introdotta in C# versione 4.0 offre la possibilità di eseguire l'override del compilatore per la tipizzazione in fase di compilazione. Con la parola chiave dynamic è possibile creare costrutti simili a quelli dei linguaggi tipizzati in modo dinamico, come JavaScript. È possibile creare dynamic x = "a string"
e quindi aggiungere 6, lasciando decidere al runtime cosa deve succedere dopo.
L'associazione dinamica è suscettibile di errori ma offre anche la possibilità di usare il linguaggio in modo estremamente avanzato.
C# versione 3.0
Data di rilascio: novembre 2007
C# versione 3.0 è stato rilasciato alla fine del 2007, insieme a Visual Studio 2008, anche se la gamma completa delle funzionalità del linguaggio è stata in realtà rilasciata con .NET Framework versione 3.5. Questa versione rappresenta un cambiamento fondamentale, perché caratterizza C# come linguaggio di programmazione dalle caratteristiche davvero eccezionali. Ecco alcune delle funzionalità principali di questa versione:
- Proprietà implementate automaticamente
- Tipi anonimi
- Espressioni di query
- Espressioni lambda
- Alberi delle espressioni
- Metodi di estensione
- Variabili locali tipizzate in modo implicito
- Metodi parziali
- Inizializzatori di oggetti e raccolte
A posteriori, molte di queste funzionalità sembrano inevitabili e inseparabili, perché si fondono l'una con l'altra in modo strategico. Si ritiene che la funzionalità killer della versione C# fosse l'espressione di query, nota anche come query Language-Integrated (LINQ).
che, grazie a una vista più particolareggiata, consente di esaminare alberi delle espressioni, espressioni lambda e tipi anonimi, le fondamenta su cui la funzionalità LINQ stessa si basa. In entrambi i casi, tuttavia, C# 3.0 ha introdotto un concetto rivoluzionario. C# 3.0 ha iniziato a creare i presupposti per la trasformazione di C# in un linguaggio ibrido, orientato agli oggetti e funzionale.
In particolare, ha reso possibile scrivere query dichiarative nello stile di SQL per eseguire operazioni, tra l'altro, sulle raccolte. Anziché scrivere un ciclo for
per calcolare la media di un elenco di numeri interi, è diventato possibile eseguire tale operazione semplicemente usando list.Average()
. La combinazione di espressioni di query e metodi di estensione ha reso un elenco di interi molto più intelligenti.
C# versione 2.0
Data di rilascio: novembre 2005
Ecco alcune delle funzionalità principali di C# 2.0, rilasciato nel 2005 insieme a Visual Studio 2005:
Altre funzionalità di C# 2.0 aggiungevano capacità alle funzionalità esistenti:
- Accessibilità separata getter/setter
- Conversioni di gruppi di metodi (delegati)
- Classi statiche
- Inferenza del delegato
All'inizio C# era un linguaggio orientato agli oggetti (OO) generico, ma con la versione 2.0 la situazione cambiò con grande rapidità. Con generics, tipi e metodi possono operare su un tipo arbitrario, mantenendo comunque l'indipendenza dal tipo. La classe List<T>, ad esempio, consente di eseguire un'iterazione attraverso List<string>
o List<int>
eseguendo operazioni indipendenti dai tipi su tali stringhe o tali numeri interi. L'uso di generics è migliore rispetto alla creazione di un ListInt
tipo che deriva da ArrayList
o cast da Object
per ogni operazione.
Con C# versione 2.0 sono arrivati gli iteratori. In breve, gli iteratori consentono di esaminare tutti gli elementi di un List
(o di altri tipi enumerabili) con un ciclo foreach
. La presenza degli iteratori come parte fondamentale del linguaggio ha migliorato notevolmente la leggibilità del codice e la possibilità di comprenderlo.
C#, tuttavia, continuava a correre dietro a Java, che aveva già rilasciato versioni che prevedevano generics e iteratori, ma questa situazione sarebbe cambiata presto. Man mano che procedevano nella loro evoluzione, infatti, i due linguaggi continuarono a differenziarsi.
Versione C# 1.2
Data di rilascio: aprile 2003
C# versione 1.2 fornita con Visual Studio .NET 2003. Conteneva alcuni piccoli miglioramenti del linguaggio. L'aspetto più importante è che a partire da questa versione, il codice veniva generato in un ciclo foreach
denominato Dispose in IEnumerator quando IEnumerator implementava IDisposable.
C# versione 1.0
Data di rilascio: gennaio 2002
Quando si torna indietro e si guarda, C# versione 1.0, rilasciata con Visual Studio .NET 2002, sembrava molto simile a Java. Come parte dei suoi obiettivi di progettazione dichiarati per ECMA, ha cercato di essere un "linguaggio semplice, moderno, orientato agli oggetti per utilizzo generico". Al momento, l'aspetto di Java significava raggiungere tali obiettivi di progettazione iniziali.
Ma se si guarda ora com'era C# 1.0, la sensazione è di disorientamento. Mancavano le capacità asincrone predefinite e alcune delle semplici funzionalità relative ai generics che ora si danno per scontate. In realtà,i generics mancavano completamente. E LINQ? Non era ancora disponibile. Queste aggiunte avrebbero richiesto ancora alcuni anni.
Rispetto alla versione odierna, C# versione 1.0 sembra privo di funzionalità e costringeva gli sviluppatori a scrivere codice piuttosto prolisso. Da qualche parte, tuttavia, bisognava cominciare. Per la piattaforma Windows, C# versione 1.0 rappresentava una valida alternativa a Java.
Le principali funzionalità di C# 1.0 includevano:
- Classi
- Struct
- Interfacce
- Eventi
- Proprietà
- Delegati
- Operatori ed espressioni
- Istruzioni
- Attributes (Attributi)
Articolooriginariamente pubblicato nel blog NDepend, gentilmente concesso da Erik Dietrich e Patrick Smacchia.