Introduzione a .NET

.NET è una piattaforma per sviluppatori open source gratuita, multipiattaforma per la creazione di molti tipi di applicazioni. Può eseguire programmi scritti in più linguaggi, dove C# è il più diffuso. Si basa su un runtime ad alte prestazioni usato nell'ambiente di produzione da molte app su larga scala.

Per informazioni su come scaricare .NET e iniziare a scrivere la prima app, vedere Introduzione.

La piattaforma .NET è stata progettata per offrire produttività, prestazioni, sicurezza e affidabilità. Fornisce la gestione automatica della memoria tramite Garbage Collector (GC). È indipendente dai tipi e dalla memoria, a causa dell'uso di un Garbage Collection e di compilatori di linguaggio rigorosi. Offre concorrenza tramite async/await e Task primitive. Include un ampio set di librerie con funzionalità generali e ottimizzate per le prestazioni su più sistemi operativi e architetture chip.

.NET include i punti di progettazione seguenti:

  • La produttività è completa con runtime, librerie, linguaggio e strumenti che contribuiscono all'esperienza utente dello sviluppatore.
  • Codice gestito è il modello di calcolo primario, mentre codice non gestito abilita ottimizzazioni manuali aggiuntive.
  • Il codice statico e dinamico sono entrambi supportati, consentendo un ampio set di scenari distinti.
  • L'interoperabilità del codice nativo e gli intrinseci hardware sono a basso costo e ad alta fedeltà (API non elaborate e accesso alle istruzioni).
  • Il codice è portabile tra piattaforme (architettura del sistema operativo e chip), mentre la destinazione della piattaforma abilita la specializzazione e l'ottimizzazione.
  • L'adattamento tra domini di programmazione (cloud, client, giochi) è abilitato con implementazioni specializzate del modello di programmazione per utilizzo generico.
  • Gli standard di settore come OpenTelemetry e gRPC sono preferibili, rispetto alle soluzioni personalizzate.

.NET viene gestito da Microsoft e dalla community. Viene aggiornato regolarmente per garantire agli utenti la distribuzione di applicazioni sicure e affidabili nell'ambiente di produzione.

Componenti

In .NET sono ora inclusi i componenti seguenti:

  • Runtime: esegue il codice dell'applicazione.
  • Librerie: forniscono funzionalità di utilità come l'analisi JSON.
  • Compilatore: compila il codice sorgente C# (e altri linguaggi) nel codice eseguibile (runtime).
  • SDK e altri strumenti: abilitano la compilazione e il monitoraggio delle app mediante flussi di lavoro moderni.
  • Stack di app: ad esempio ASP.NET Core e Windows Forms, che consentono di scrivere le app.

Il runtime, le librerie e i linguaggi sono i pilastri dello stack .NET. Componenti di livello superiore, come gli strumenti .NET e gli stack di app, come ASP.NET Core, si basano su questi pilastri. C# è il linguaggio di programmazione principale per .NET e gran parte di .NET è scritto in C#.

C# è orientato agli oggetti e il runtime supporta l'orientamento degli oggetti. C# richiede Garbage Collection e il runtime fornisce un Garbage Collector di traccia. Le librerie (e anche gli stack di app) modellano tali funzionalità in concetti e modelli di oggetti che consentono agli sviluppatori di scrivere algoritmi in modo produttivo, all'interno di flussi di lavoro intuitivi.

Le librerie principali espongono migliaia di tipi, molti dei quali si integrano con il linguaggio C# e lo alimentano. Ad esempio, l'istruzione C# foreach consente di enumerare raccolte arbitrarie. Le ottimizzazioni basate su criteri consentono di elaborare le raccolte come List<T> in modo semplice ed efficiente. È possibile lasciare la gestione delle risorse fino a Garbage Collection, ma è possibile eseguire la pulizia dei prompt tramite IDisposable e il supporto del linguaggio diretto nell'istruzione using.

Il supporto per eseguire più operazioni contemporaneamente è fondamentale per praticamente tutti i carichi di lavoro. Potrebbe trattarsi di applicazioni client che eseguono l'elaborazione in background mantenendo reattiva l'interfaccia utente, di servizi che gestiscono diverse migliaia di richieste simultanee, di dispositivi che rispondono a una moltitudine di stimoli simultanei o di macchine ad alta potenza che parallelizzano l'elaborazione di operazioni a elevato utilizzo di calcolo. Il supporto per la programmazione asincrona è una funzionalità di prima classe del linguaggio di programmazione C#, che fornisce le parole chiave async e await che semplificano la scrittura e la composizione di operazioni asincrone, sfruttando al tempo stesso i vantaggi completi di tutti i costrutti del flusso di controllo che il linguaggio deve offrire.

Il sistema di tipi offre un'ampiezza significativa, con un'attenzione particolare alla sicurezza, alla descrittività, al dinamismo e all'interoperabilità nativa. In primo luogo, il sistema di tipi abilita un modello di programmazione orientato agli oggetti. Include i tipi, l'ereditarietà (classe base singola), le interfacce (incluse le implementazioni predefinite del metodo) e l'invio di metodi virtuali per fornire un comportamento ragionevole per tutti i livelli di sovrapposizione del tipo consentiti dall'orientamento dell'oggetto. I tipi generici sono una funzionalità diffusa che consente di specializzare le classi in uno o più tipi.

Il runtime .NET fornisce la gestione automatica della memoria tramite un Garbage Collector. Per qualsiasi linguaggio, il modello di gestione della memoria è probabilmente la caratteristica più definita. Ciò vale per i linguaggi .NET. .NET dispone di un Garbage Collection di traccia a ottimizzazione automatica. L'obiettivo è quello di garantire un funzionamento "a mani libere" nel caso generale, offrendo al contempo opzioni di configurazione per i carichi di lavoro più estremi. L'attuale Garbage Collection è il risultato di numerosi anni di investimenti e apprendimento da una moltitudine di carichi di lavoro.

I tipi valore e i blocchi di memoria allocati allo stack offrono un controllo più diretto e di basso livello sui dati e sull'interoperabilità della piattaforma nativa, a differenza dei tipi gestiti da Garbage Collection di .NET. La maggior parte dei tipi primitivi presenti in .NET, come i tipi integer, rappresentano tipi valore e gli utenti possono definire i propri tipi con una semantica simile. I tipi valore sono completamente supportati tramite il sistema generics di NET, ovvero i tipi generici come List<T> possono fornire rappresentazioni di memoria flat, senza overhead delle raccolte di tipi valore.

La reflection è un paradigma di "programmi come dati", consentendo a una parte di un programma di eseguire query in modo dinamico e di richiamare un'altra, in termini di assembly, tipi e membri. Risulta particolarmente utile per strumenti e modelli di programmazione ad associazione tardiva.

Le eccezioni sono il modello primario di gestione degli errori in .NET. Le eccezioni offrono il vantaggio che le informazioni sugli errori non devono essere rappresentate nelle firme del metodo o gestite da ogni metodo. La gestione corretta delle eccezioni è essenziale per l'affidabilità dell'applicazione. Per evitare che l'app si arresti in modo anomalo, è possibile gestire intenzionalmente le eccezioni previste nel codice. Un'app arrestata in modo anomalo è più affidabile e indipendente, rispetto a un'app con un comportamento indefinito.

Gli stack di app, ad esempio ASP.NET Core e Windows Forms, si avvalgono e si basano sulle librerie di basso livello, sul linguaggio e sul runtime. Gli stack di app definiscono il modo in cui le app vengono costruite e il relativo ciclo di vita di esecuzione.

L'SDK e gli altri strumenti consentono un'esperienza di sviluppo moderna, sia in un desktop per sviluppatori che per l'integrazione continua (CI). L'esperienza di sviluppo moderna include la possibilità di compilare, analizzare e testare il codice. I progetti .NET possono spesso essere compilati da un singolo comando dotnet build, che orchestra il ripristino dei pacchetti NuGet e la compilazione di dipendenze.

NuGet è lo strumento di gestione dei pacchetti per .NET. Include centinaia di migliaia di pacchetti, che implementano funzionalità per numerosi scenari. La maggior parte delle app si basa su pacchetti NuGet per alcune funzionalità. La raccolta NuGet viene gestita da Microsoft.

Gratis e open source

.NET è gratuito, open source ed è un progetto .NET Foundation. .NET viene gestito da Microsoft e dalla community su GitHub in diversi repository.

I file binari e di origine .NET sono concessi in licenza con la licenza MIT. Le licenze aggiuntive si applicano a Windows.

Supporto

.NET è supportato da più organizzazioni che operano per garantire che .NET possa essere eseguito in più sistemi operativi e venga mantenuto aggiornato. Può essere usato nelle architetture Arm64, x64 e x86.

Le nuove versioni di .NET vengono rilasciate annualmente a novembre, in base alle versioni e ai criteri di supporto. Viene aggiornato mensilmente il Patch Tuesday (secondo martedì), in genere alle ore 10:00 del fuso orario Pacifico (Stati Uniti).

Ecosistema .NET

Esistono più varianti di .NET, ognuna delle quali supporta un tipo diverso di app. La ragione di più varianti è in parte storica, in parte tecnica.

Implementazioni di .NET:

  • .NET Framework: il .NET originale. Fornisce l'accesso alle ampie funzionalità di Windows e Windows Server. È supportato attivamente, nella manutenzione.
  • Mono: la community originale e .NET open source. Implementazione multipiattaforma di .NET Framework. Supportata attivamente per Android, iOS e WebAssembly.
  • .NET (Core): .NET moderno. Implementazione multipiattaforma e open source di .NET, ripensata per l'era del cloud, pur rimanendo significativamente compatibile con .NET Framework. Supportata attivamente per Linux, macOS e Windows.

Passaggi successivi