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 12
Rilasciata a novembre 2023
In C# versione 12 sono state aggiunte le funzionalità seguenti:
- Costruttori primari: è possibile creare costruttori primari in qualsiasi tipo
class
ostruct
. - Espressioni di raccolta: nuova sintassi per specificare le espressioni di raccolta, incluso l'elemento spread (
..e
), per espandere qualsiasi raccolta. - Matrici inline: le matrici inline consentono di creare una matrice di dimensioni fisse in un tipo
struct
. - Parametri facoltativi nelle espressioni lambda: è possibile definire i valori predefiniti per i parametri nelle espressioni lambda.
- Parametri
ref readonly
- I parametriref readonly
consentono maggiore chiarezza per le API che potrebbero usare parametriref
oin
. - Alias di qualsiasi tipo: è possibile usare la direttiva alias
using
per eseguire un alias di qualsiasi tipo, non solo per i tipi con nome associato. - Attributo sperimentale: indicare una funzionalità sperimentale.
Infine, la funzionalità degli intercettori è stata rilasciata in anteprima.
In generale, C# 12 offre nuove funzionalità che rendono più produttiva la scrittura di codice C#. La sintassi già conosciuta è stata resa disponibile in più posizioni. Altre sintassi hanno permesso la coerenza per i concetti correlati.
C# versione 11
Rilasciata a novembre 2022
Di seguito sono elencate le funzionalità aggiunte in C#11:
- Valori letterali stringa non elaborati
- Supporto matematico generico
- Attributi generici
- Valori letterali stringa UTF-8
- Nuove righe nelle espressioni di interpolazione di stringhe
- Criteri di elenco
- Tipi locali di file
- Membri obbligatori
- Struct predefiniti automaticamente
- Applicazione dei criteri di ricerca per
Span<char>
su un oggettostring
costante - Ambito
nameof
esteso - IntPtr e UIntPtr numerici
- Campi
ref
escoped ref
- Miglioramento della conversione di un gruppo di metodi in un oggetto delegato
- Ciclo di avviso 7
C# 11 introduce la matematica generica e diverse funzionalità per tale finalità. È possibile scrivere algoritmi numerici una sola volta per tutti i tipi di numeri. Altre funzionalità sono disponibili per semplificare l'uso di tipi struct
, come membri obbligatori e struct predefiniti automaticamente. L'uso di stringhe risulta più semplice con valori letterali di stringa non elaborata, newline nelle interpolazioni di stringhe e valori letterali stringa UTF-8. Funzionalità come tipi locali di file semplificano i generatori di origine. Infine, i modelli di elenco forniscono ulteriore supporto per i criteri di ricerca.
C# versione 10
Rilasciata a 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 interpolate
- Direttive
global using
- Dichiarazione di namespace con ambito file
- Criteri di proprietà estesi
- Miglioramenti delle espressioni lambda
- Possibilità di usare stringhe
const
interpolate - Sealing di
ToString()
per i tipi record - Assegnazione definita migliorata
- Assegnazione e dichiarazione nella stessa decostruzione
- Possibilità di applicare l'attributo
AsyncMethodBuilder
ai metodi - Attributo CallerArgumentExpression
- Pragma
#line
avanzato
Altre funzionalità sono disponibili in modalità di anteprima. Per usare queste funzionalità, è necessario impostare <LangVersion>
su Preview
nel progetto:
- Attributi generici più avanti in questo articolo.
- Membri astratti statici nelle interfacce.
C# 10 continua a lavorare sulla rimozione dell’etichetta, sulla separazione dei dati dagli algoritmi e sul miglioramento delle prestazioni per il runtime .NET.
Molte delle funzionalità indicano che si digita meno codice per esprimere gli stessi concetti. Gli struct di record sintetizzano molti degli stessi metodi delle classi di record. Gli struct e i tipi anonimi supportano le espressioni. Le direttive d’uso globali e le dichiarazioni dello spazio dei nomi nell’ambito di file illustrano più chiaramente le dipendenze e l'organizzazione dello spazio dei nomi. I miglioramenti lambda semplificano la dichiarazione di espressioni lambda in cui vengono usate. I nuovi criteri di proprietà e i miglioramenti della decostruzione creano codice più conciso.
I nuovi gestori di stringhe interpolati e il nuovo comportamento di AsyncMethodBuilder
possono migliorare le prestazioni. Queste funzionalità di linguaggio sono state applicate nel runtime di .NET per migliorare le prestazioni in .NET 6.
È a partire da C# 10 che le versioni .NET sono diventate a cadenza annuale. Poiché non tutte le funzionalità possono essere completate in un anno, è possibile provare solo alcune funzionalità di "anteprima" in C# 10. Entrambi gli attributi generici e i membri astratti statici nelle interfacce possono essere usati, ma queste funzionalità di anteprima potrebbero cambiare prima del rilascio finale.
C# versione 9
Rilasciata a novembre 2020
C# 9 è stato rilasciato con .NET 5. È la versione di linguaggio predefinita per qualsiasi assembly destinato alla versione .NET 5. Contiene le seguenti nuove funzionalità e ottimizzazioni:
- Record
- Setter di sola inizializzazione
- Istruzioni di primo livello
- Miglioramenti della corrispondenza dei criteri: modelli relazionali e modelli logici
- Prestazioni e interoperabilità
- Funzionalità di adattamento e finitura
C# 9 porta avanti tre caratteristiche delle versioni precedenti: la rimozione dell’etichetta, la separazione dei dati dagli algoritmi e la fornitura di più criteri in più posizioni.
Istruzioni di alto livello rendono il programma principale più semplice da leggere. L’etichetta non è più necessaria: non c’è bisogno di uno spazio dei nomi, una classe Program
, e static void Main()
.
L'introduzione di records
fornisce una sintassi concisa per i tipi di riferimento che seguono la semantica dei valori per uguaglianza. Questi tipi vengono usati per definire contenitori di dati che in genere definiscono un comportamento minimo. I setter Init-only forniscono la funzionalità per la mutazione non distruttiva nei record (espressioni with
). C# 9 aggiunge anche tipi restituiti covarianti in modo che i record derivati possano eseguire l'override dei metodi virtuali e restituire un tipo derivato da quello restituito del metodo di base.
Le funzionalità dei criteri di ricerca espanse in diversi modi. I tipi numerici ora supportano criteri di intervallo. I criteri possono essere combinati usando criteri and
, or
e not
. È possibile aggiungere parentesi per chiarificare modelli più complessi:
C# 9 include nuovi miglioramenti ai criteri di ricerca:
- I criteri di tipo stabiliscono la corrispondenza tra un oggetto e un tipo specifico
- I criteri con parentesi impongono o evidenziano la precedenza delle combinazioni di criteri
- I criteri
and
congiuntivi richiedono la corrispondenza di entrambi i criteri - I criteri
or
disgiuntivi richiedono la corrispondenza di uno dei due criteri - I criteri
not
di negazione richiedono l'assenza di corrispondenza di un criterio - I modelli relazionali richiedono che l'input sia minore di, maggiore di, minore o uguale a oppure maggiore o uguale a rispetto a una determinata costante
Questi miglioramenti arricchiscono la sintassi relativa ai criteri. Considerare i seguenti esempi:
public static bool IsLetter(this char c) =>
c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';
Con le parentesi facoltative per precisare che and
ha precedenza rispetto a or
:
public static bool IsLetterOrSeparator(this char c) =>
c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';
Uno degli usi più comuni è una nuova sintassi per un controllo Null:
if (e is not null)
{
// ...
}
Ognuno di questi criteri può essere usato in qualsiasi contesto in cui siano consentiti criteri: espressioni del criterio is
, espressioni switch
, criteri nidificati e il criterio dell'etichetta case
di un'istruzione switch
.
Un altro set di funzionalità supporta l'elaborazione ad alte prestazioni in C#:
- I tipi
nint
enuint
modellano i tipi Integer di dimensioni originali nella CPU di destinazione. - I puntatori di funzione forniscono funzionalità simili a delegati, evitando le allocazioni necessarie per la creazione di un oggetto delegato.
- L'istruzione
localsinit
può essere omessa per salvare le istruzioni.
Prestazioni e interoperabilità
Un‘altra serie di miglioramenti supporta scenari in cui generatori di codice aggiungono funzionalità:
- Gli inizializzatori di modulo sono metodi chiamati dal runtime quando viene caricato un assembly.
- I metodi parziali supportano nuovi modificatori di accesso e tipi restituiti non nulli. In questi casi, è necessario fornire un'implementazione.
Funzionalità di adattamento e finitura
C# 9 aggiunge molte altre piccole funzionalità che migliorano la produttività degli sviluppatori, sia nella scrittura che nella lettura di codice:
- Espressioni di tipo di destinazione
new
- Funzioni anonime
static
- Espressioni condizionali di tipo di destinazione
- Supporto dell'estensione
GetEnumerator()
per i cicliforeach
- Le espressioni lambda possono dichiarare parametri di discard
- Gli attributi possono essere applicati alle funzioni locali
La versione 9 di C# continua nell’impegno per mantenere C# un linguaggio di programmazione moderno e universale. Le funzionalità continuano a supportare carichi di lavoro e tipi di applicazioni moderni.
C# versione 8.0
Rilasciata a settembre 2019
C# 8.0 è la prima importante versione di C# destinata specificamente a .NET Core. Alcune funzionalità si basano sulle nuove caratteristiche di Common Language Runtime (CLR), altre sui tipi di librerie aggiunti solo in .NET Core. C# 8.0 aggiunge al linguaggio C# le seguenti funzionalità e miglioramenti:
- Membri di sola lettura
- Metodi di interfaccia predefiniti
- Miglioramenti dei criteri di ricerca:
- Espressioni switch
- Criteri per le proprietà
- Criteri per le tuple
- Criteri per la posizione
- Dichiarazioni using
- Funzioni locali statiche
- Struct ref Disposable
- Tipi riferimento nullable
- Flussi asincroni
- Indici e intervalli
- Assegnazione null-coalescing
- Tipi costruiti non gestiti
- Stackalloc in espressioni annidate
- Miglioramento delle stringhe verbatim interpolate
I membri di interfaccia predefinita richiedono miglioramenti in CLR. Queste funzionalità sono state aggiunte in CLR per .NET Core 3.0. Intervalli, indici e flussi asincroni necessitano di nuovi tipi nelle librerie .NET Core 3.0. Se implementati nel compilatore, i tipi riferimento nullable 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
Rilasciata a 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 di 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 attributi al campo sottostante delle proprietà implementate automaticamente.
- È stata migliorata la risoluzione del metodo quando gli argomenti differiscono per
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
Rilasciata a novembre 2017
C# 7.2 ha aggiunto diverse funzionalità del linguaggio di piccole dimensioni:
- Inizializzatori su matrici
stackalloc
. - Usare istruzioni
fixed
con qualsiasi tipo che supporta un criterio. - Accedere a campi fissi senza blocco.
- Riassegnare le variabili locali
ref
. - Dichiarare tipi
readonly struct
per indicare che uno struct non è modificabile e deve essere passato come parametroin
ai relativi metodi membro. - Aggiungere il modificatore
in
a parametri per specificare che un argomento viene passato per riferimento, ma non modificato dal metodo chiamato. - Usare il modificatore
ref readonly
su valori restituiti dai metodi per indicare che un metodo restituisce il valore per riferimento, ma non consente scritture su tale oggetto. - Dichiarare tipi
ref struct
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 in posizione finale:
- Gli argomenti posizionali possono seguire gli argomenti denominati.
- Caratteri di sottolineatura iniziali nei valori letterali numerici:
- I valori letterali numerici possono ora includere caratteri di sottolineatura iniziali prima di qualsiasi cifra stampata.
- Modificatore di accesso
private protected
:- 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
Rilasciata a agosto 2017
Con C# 7.1, C# ha iniziato a rilasciare versioni intermedie. Questa versione ha aggiunto l'elemento di configurazione per la 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:
- Metodo
async
Main
- Il punto di ingresso per un'applicazione può avere il modificatore
async
.
- Il punto di ingresso per un'applicazione può avere il modificatore
- Espressioni letterali
default
- 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 dispone di due opzioni -refout
e -refonly
che controllano la generazione dell'assembly di riferimento.
C# versione 7.0
Data di rilascio:marzo 2017
La versione C# 7.0 è stata rilasciata con Visual Studio 2017. Questa versione ha alcune interessanti novità nello spirito 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 di riferimento
- Valori restituiti
Altre funzionalità:
Tutte queste caratteristiche offrono nuove funzionalità agli sviluppatori, oltre alla 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
Rilasciata a luglio 2015
La versione 6.0, rilasciata con Visual Studio 2015, ha rilasciato molte funzionalità di piccole dimensioni 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 stringa
- Operatore nameof
Le altre nuove funzionalità includono:
- Inizializzatori di indice
- Await nei blocchi catch e finally
- Valori predefiniti per le proprietà solo getter
Se si esaminano queste funzionalità insieme, si noterà un modello interessante. In questa versione, C# ha eliminato il boilerplate del linguaggio per rendere il codice più conciso e leggibile. 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
Rilasciata a agosto 2012
C# versione 5.0, rilasciata con Visual Studio 2012, era una versione incentrata 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.
C# versione 4.0
Rilasciata a aprile 2010
C# versione 4.0, rilasciata con Visual Studio 2010, ha introdotto alcune interessanti nuove funzionalità:
- Associazione dinamica
- Argomenti denominati/facoltativi
- Covarianti e controvarianti generiche
- Tipi di interoperabilità incorporati
I tipi di interoperabilità incorporati hanno facilitato la distribuzione necessaria per la 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
Rilasciata a 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 oggetto e di insieme
A posteriori, molte di queste funzionalità sembrano inevitabili e inseparabili, perché si fondono l'una con l'altra in modo strategico. La funzionalità chiave di questa versione di C# era l'espressione di query, nota anche come LINQ (Language-Integrated Query).
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 le basi per trasformare C# in un linguaggio ibrido orientato agli oggetti/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 gli elenchi di numeri interi molto più pratici.
C# versione 2.0
Rilasciata a 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
Mentre C# è partito come linguaggio OO (Object-Oriented) generico, C# versione 2.0 ha cambiato queste premesse molto in fretta. 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. È consigliabile usare i generics anziché creare un tipo ListInt
derivato da ArrayList
o eseguire il 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.
Versione C# 1.2
Rilasciata a 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
Rilasciata a gennaio 2002
Retrospettivamente, C# versione 1.0, rilasciata con Visual Studio .NET 2002, sembra molto simile a Java. Come affermato negli obiettivi di progettazione dichiarati per ECMA, C# cercava di essere "un linguaggio orientato agli oggetti di utilizzo generico, semplice e moderno". All'epoca, somigliare molto a Java significava aver raggiunto tali obiettivi di progettazione di allora.
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 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:
Articolo originariamente pubblicato nel blog NDepend, gentilmente concesso da Erik Dietrich e Patrick Smacchia.