Novità di .NET 6

.NET 6 offre le parti finali del piano di unificazione di .NET avviato con .NET 5. .NET 6 unifica l'SDK, le librerie di base e il runtime nelle app per dispositivi mobili, desktop, IoT e cloud. Oltre a questa unificazione, l'ecosistema .NET 6 offre:

  • Sviluppo semplificato: iniziare è semplice. Le nuove funzionalità del linguaggio in C# 10 riducono la quantità di codice da scrivere. Gli investimenti nello stack Web e nelle API minime semplificano la scrittura rapida di microservizi più piccoli e veloci.

  • Prestazioni migliori: .NET 6 è il framework Web dello stack completo più veloce e ciò riduce i costi di calcolo in caso di esecuzione nel cloud.

  • Produttività massima: .NET 6 e Visual Studio 2022 forniscono ricaricamento rapido, nuovi strumenti Git, modifica intelligente del codice, strumenti di diagnostica e test affidabili e una migliore collaborazione tra i team.

.NET 6 sarà supportato per tre anni come versione con supporto a lungo termine (LTS).

Le funzionalità di anteprima sono disabilitate per impostazione predefinita. Non sono supportate anche per l'uso nell'ambiente di produzione ed è possibile che vengano rimosse in una versione futura. La nuova classe RequiresPreviewFeaturesAttribute viene usata per annotare le API di anteprima e un analizzatore corrispondente avvisa se si usano queste API di anteprima.

.NET 6 è supportato da Visual Studio 2022 e Visual Studio 2022 per Mac (e versioni successive).

Questo articolo non illustra tutte le nuove funzionalità di .NET 6. Per visualizzare tutte le nuove funzionalità e per altre informazioni sulle funzionalità elencate in questo articolo, vedere il post di blog Annuncio di .NET 6.

Prestazioni

.NET 6 include numerosi miglioramenti delle prestazioni. Questa sezione elenca alcuni dei miglioramenti apportati a FileStream, ottimizzazione PGO (Profile Guided Optmization)e compilazione AOT. Per informazioni dettagliate, vedere il post di blog Miglioramenti delle prestazioni in .NET 6.

FileStream

Il tipo System.IO.FileStream è stato riscritto per .NET 6 per offrire prestazioni e affidabilità migliori in Windows. Ora FileStream non si blocca mai quando viene creato per le operazioni di I/O asincrone in Windows. Per altre informazioni, vedere il post di blog Miglioramenti dell'I/O dei file in .NET 6.

Ottimizzazione PGO

L'ottimizzazione PGO (Profile-Guided Optimization) è la posizione in cui il compilatore JIT genera codice ottimizzato in termini di tipi e percorsi di codice usati più di frequente. .NET 6 introduce l'ottimizzazione PGO dinamica. L'ottimizzazione PGO dinamica interagisce strettamente con la compilazione a livelli per ottimizzare ulteriormente il codice in base a strumentazione aggiuntiva che viene resa disponibile durante il livello 0. L'ottimizzazione PGO dinamica è disabilitata per impostazione predefinita, ma è possibile abilitarla con la DOTNET_TieredPGOvariabile di ambiente . Per altre informazioni, vedere Miglioramenti delle prestazioni JIT.

Crossgen2

.NET 6 introduce Crossgen2, il successore di Crossgen, che è stato rimosso. Crossgen e Crossgen2 sono strumenti che forniscono compilazione AOT (Ahead-of-Time) per migliorare il tempo di avvio di un'app. Crossgen2 viene scritto in C# invece di C++e può eseguire analisi e ottimizzazione che non erano possibili con la versione precedente. Per altre informazioni, vedere Conversazione su Crossgen2.

Supporto per Arm64

La versione .NET 6 include il supporto per i sistemi operativi macOS Arm64 (o "Apple Silicon") e Windows Arm64, sia per l'esecuzione nativa di Arm64 sia per l'emulazione di x64. I programmi di installazione di x64 e Arm64 .NET inoltre vengono ora installati affiancati. Per altre informazioni, vedere Supporto .NET per macOS 11 e Windows 11 per Arm64 e x64.

Ricaricamento rapido

Il ricaricamento rapido è una funzionalità che consente di modificare il codice sorgente dell'app e applicare immediatamente tali modifiche all'app in esecuzione. Lo scopo della funzionalità è aumentare la produttività evitando i riavvii delle app tra le modifiche. Il ricaricamento rapido è disponibile in Visual Studio 2022 e nello strumento da riga di comando dotnet watch. Il ricaricamento rapido funziona con la maggior parte dei tipi di app .NET e per il codice sorgente di C#, Visual Basic e C++. Per altre informazioni, vedere il post di blog sul ricaricamento rapido.

.NET MAUI

L'interfaccia utente dell'app multipiattaforma .NET (.NET MAUI) è ancora in anteprima, con una versione finale candidata disponibile nel primo trimestre del 2022 e la disponibilità generale nel secondo trimestre del 2022. .NET MAUI consente di creare app client native per sistemi operativi desktop e per dispositivi mobili con una singola codebase. Per altre informazioni, vedere il post di blog Aggiornamento nell'interfaccia utente dell'app multipiattaforma .NET.

C# 10 e modelli

C# 10 include innovazioni quali direttive global using, dichiarazioni di spazi dei nomi con ambito file e struct di record. Per altre informazioni, vedere Novità di C# 10.

In combinazione con questo lavoro, i modelli di progetto .NET SDK per C# sono stati modernizzati per usare alcune delle nuove funzionalità del linguaggio:

  • Metodo async Main
  • Istruzioni di primo livello
  • Espressioni new con tipo di destinazione
  • Direttive global using implicite
  • Spazi dei nomi con ambito file
  • Tipi riferimento nullable

Aggiungendo queste nuove funzionalità del linguaggio ai modelli di progetto, il nuovo codice inizia con le funzionalità abilitate. Il codice esistente non è tuttavia interessato quando si esegue l'aggiornamento a .NET 6. Per altre informazioni su queste modifiche ai modelli, vedere il post di blog .NET SDK: modelli di progetto C# modernizzati.

F# e Visual Basic

F# 6 aggiunge diversi miglioramenti al linguaggio F# e F# Interactive. Per altre informazioni, vedere Novità di F# 6.

Visual Basic offre miglioramenti all'esperienza di Visual Studio e all'avvio del progetto Windows Form.

Carichi di lavoro SDK

Per mantenere ridotte le dimensioni di .NET SDK, alcuni componenti sono stati inseriti in nuovi carichi di lavoro SDK facoltativi. Questi componenti includono .NET MAUI e WebAssembly Blazor AOT. Se si usa Visual Studio, verrà eseguita l'installazione di tutti i carichi di lavoro SDK necessari. Se si usa l'interfaccia della riga di comando di .NET, è possibile gestire i carichi di lavoro usando i nuovi comandi dotnet workload:

Comando Descrizione
dotnet workload search Cerca i carichi di lavoro disponibili.
dotnet workload install Installa un carico di lavoro specificato.
dotnet workload uninstall Rimuove un carico di lavoro specificato.
dotnet workload update Aggiorna i carichi di lavoro installati.
dotnet workload repair Reinstalla tutti i carichi di lavoro installati per ripristinare un'installazione interrotta.
dotnet workload list Elenca i carichi di lavoro installati.

Per altre informazioni, vedere Carichi di lavoro SDK facoltativi.

API System.Text.Json

Molti miglioramenti sono stati apportati in System.Text.Json in .NET 6, che è quindi ora una soluzione di serializzazione di "qualità industriale".

Generatore di origini

.NET 6 aggiunge un nuovo generatore di origini per System.Text.Json. La generazione di origini funziona con JsonSerializer e può essere configurata in diversi modi. Può migliorare le prestazioni, ridurre l'utilizzo della memoria e facilitare il trimming degli assembly. Per altre informazioni, vedere Come scegliere la reflection o la generazione di origini in System.Text.Json e Come usare la generazione di origini in System.Text.Json.

DOM scrivibile

È stato aggiunto un nuovo modello DOM (Document Object Model) scrivibile, che integra il DOM di sola lettura preesistente. La nuova API offre un'alternativa di serializzazione leggera per i casi in cui l'uso di tipi POCO (Plain Old CLR Object) non è possibile. Consente inoltre di passare in modo efficiente a una sottosezione di un albero JSON di grandi dimensioni e leggere una matrice o deserializzare un oggetto POCO da tale sottosezione. Sono stati aggiunti i nuovi tipi seguenti per supportare il DOM scrivibile:

Per altre informazioni, vedere Opzioni DOM per JSON.

Serializzazione IAsyncEnumerable

System.Text.Json supporta ora la serializzazione e la deserializzazione con istanze di IAsyncEnumerable<T>. I metodi di serializzazione asincroni enumerano tutte le istanze di IAsyncEnumerable<T> in un grafico di oggetti e quindi le serializzano come matrici JSON. Per la deserializzazione, è stato aggiunto il nuovo metodo JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken). Per altre informazioni, vedere Serializzazione IAsyncEnumerable.

Altre nuove API

Nuove interfacce di serializzazione per la convalida e la definizione di valori predefiniti:

Per altre informazioni, vedere Callback.

Nuovo attributo di ordinamento delle proprietà:

Nuovo metodo per scrivere JSON "non elaborato":

Serializzazione e deserializzazione sincrone in un flusso:

Nuova opzione per ignorare un oggetto quando viene rilevato un ciclo di riferimento durante la serializzazione:

Per altre informazioni sulla serializzazione e la deserializzazione con System.Text.Json, vedere Serializzazione e deserializzazione JSON in .NET.

HTTP/3

.NET 6 include il supporto in anteprima per HTTP/3, una nuova versione di HTTP. HTTP/3 risolve alcuni problemi di funzionalità e prestazioni esistenti usando un nuovo protocollo di connessione sottostante denominato QUIC. QUIC stabilisce le connessioni più rapidamente e le connessioni sono indipendenti dall'indirizzo IP, consentendo ai client mobili di spostarsi tra reti Wi-Fi e reti cellulari. Per altre informazioni, vedere Usare HTTP/3 con HttpClient.

ASP.NET Core

ASP.NET Core include miglioramenti nelle API minime, compilazione AOT (Ahead-of-Time) per le app WebAssembly Blazor e app a pagina singola. È ora inoltre possibile eseguire il rendering dei componenti Blazor da JavaScript e integrarli con le app basate su JavaScript esistenti. Per altre informazioni, vedere Novità di ASP.NET Core 6.

OpenTelemetry

.NET 6 offre un supporto migliorato per OpenTelemetry, che è una raccolta di strumenti, API e SDK che consentono di analizzare le prestazioni e il comportamento del software. Le API nello spazio dei nomi System.Diagnostics.Metrics implementano la specifica dell'API OpenTelemetry Metrics. Sono ad esempio disponibili quattro classi di strumenti per supportare diversi scenari di metriche. Le classi di strumenti sono:

Sicurezza

.NET 6 aggiunge il supporto dell'anteprima per due mitigazioni della sicurezza chiave: CET (Control-flow Enforcement Technology) e W^X ("Write Exclusive Execute").

CET è una tecnologia Intel disponibile in alcuni processori Intel e AMD più recenti. Aggiunge all'hardware funzionalità che proteggono da alcuni attacchi di hijack del flusso di controllo. .NET 6 fornisce supporto per CET per le app Windows x64 ed è necessario abilitarlo in modo esplicito. Per altre informazioni, vedere Compatibilità di .NET 6 con gli stack shadow Intel CET.

W^X è disponibile per tutti i sistemi operativi con .NET 6, ma è abilitato per impostazione predefinita solo in Apple Silicon. W^X blocca il percorso di attacco più semplice non consentendo alle pagine di memoria di essere contemporaneamente scrivibili ed eseguibili.

Trimming IL

Il trimming delle distribuzioni autonome è stato migliorato. In .NET 5 viene eseguito il trimming solo degli assembly inutilizzati. .NET 6 aggiunge il trimming anche per tipi e membri inutilizzati. Gli avvisi di trimming, che segnalano la posizione in cui il trimming può rimuovere il codice usato in fase di esecuzione, sono inoltre ora abilitati per impostazione predefinita. Per altre informazioni, vedere Trimming di distribuzioni ed eseguibili autonomi.

Analisi codice

.NET 6 SDK include alcuni nuovi analizzatori di codice che riguardano la compatibilità delle API, la compatibilità della piattaforme, la sicurezza di trimming, l'uso di span nella concatenazione e suddivisione di stringhe, API di stringa più veloci e API di raccolta più veloci. Per un elenco completo dei nuovi analizzatori (e di analizzatori rimossi), vedere Versioni dell'analizzatore - .NET 6.

Guardie della piattaforma personalizzate

L'analizzatore di compatibilità della piattaforma riconosce i metodi Is<Platform> nella classe OperatingSystem , ad esempio OperatingSystem.IsWindows(), come guard della piattaforma. Per consentire guard della piattaforma personalizzate, .NET 6 introduce due nuovi attributi che è possibile usare per annotare campi, proprietà o metodi con un nome di piattaforma supportato o non supportato:

WinForms

Application.SetDefaultFont(Font) è un nuovo metodo in .NET 6 che imposta il tipo di carattere predefinito nell'applicazione.

I modelli per le app Windows Form in C# sono stati aggiornati per supportare direttive global using, spazi dei nomi con ambito file e tipi di riferimento che ammettono i valori Null. Includono anche il codice bootstrap dell'applicazione, che riduce il codice boilerplate e consente alla finestra di progettazione di Windows Form di eseguire il rendering dell'area di progettazione nel tipo di carattere preferito. Il codice bootstrap è una chiamata a ApplicationConfiguration.Initialize(), che è un metodo generato dall'origine che genera chiamate ad altri metodi di configurazione, ad esempio Application.EnableVisualStyles(). Se si imposta un tipo di carattere non predefinito tramite la proprietà ApplicationDefaultFont di MSBuild, ApplicationConfiguration.Initialize() genera inoltre una chiamata a SetDefaultFont(Font).

Per altre informazioni, vedere il post di blog Novità di Windows Form.

Compilazione di origine

Il tarball di origine, che contiene tutta l'origine per .NET SDK, è ora un prodotto della compilazione di .NET SDK. Altre organizzazioni, ad esempio Red Hat, possono creare la propria versione dell'SDK usando questo tarball di origine.

Moniker del framework di destinazione

Sono stati aggiunti altri moniker del framework di destinazione specifici del sistema operativo per .NET 6, ad esempio net6.0-android, net6.0-ios e net6.0-macos. Per altre informazioni, vedere Moniker del framework di destinazione specifici del sistema operativo .NET 5+.

Operazioni matematiche generiche

Nell'anteprima è possibile usare operatori su tipi generici in .NET 6. .NET 6 introduce numerose interfacce che usano la nuova funzionalità di anteprima di C# 10, i membri dell'interfaccia static abstract. Queste interfacce corrispondono a operatori diversi, ad esempio IAdditionOperators rappresenta l'operatore +. Le interfacce sono disponibili nel pacchetto NuGet System.Runtime.Experimental. Per altre informazioni, vedere il post di blog Operazioni matematiche generiche.

Convalida del pacchetto NuGet

Se si è sviluppatori di librerie NuGet, i nuovi strumenti di convalida dei pacchetti consentono di verificare che i pacchetti siano coerenti e ben formati. È possibile determinare se:

  • Sono state apportate modifiche che causano un'interruzione tra le versioni del pacchetto.
  • Il pacchetto ha lo stesso set di API pubbliche per tutte le implementazioni specifiche del runtime.
  • Esistono lacune per l'applicabilità del framework di destinazione o del runtime.

Per altre informazioni, vedere il post di blog Convalida del pacchetto.

API di reflection

.NET 6 introduce le nuove API seguenti che esaminano il codice e forniscono informazioni sul supporto dei valori Null:

Queste API sono utili per strumenti e serializzatori basati su reflection.

API Microsoft.Extensions

Diversi spazi dei nomi delle estensioni presentano miglioramenti in .NET 6, come illustrato nella tabella seguente.

Spazio dei nomi Miglioramenti
Microsoft.Extensions.DependencyInjection CreateAsyncScope consente di usare in modo sicuro un'istruzione using per un provider di servizi che registra un servizio IAsyncDisposable.
Microsoft.Extensions.Hosting I nuovi metodi ConfigureHostOptions semplificano la configurazione dell'applicazione.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging ha un nuovo generatore di origini per le API di registrazione con prestazioni elevate. Il generatore di origini viene attivato se si aggiunge il nuovo LoggerMessageAttribute a un metodo di registrazione partial. In fase di compilazione il generatore genera l'implementazione del metodo partial, in genere più veloce in fase di esecuzione rispetto alle soluzioni di registrazione esistenti. Per altre informazioni, vedere Generazione dell'origine di registrazione in fase di compilazione.

Nuove API LINQ

Sono stati aggiunti numerosi metodi LINQ in .NET 6. La maggior parte dei nuovi metodi elencati nella tabella seguente include metodi equivalenti nel tipo System.Linq.Queryable.

metodo Descrizione
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Prova a determinare il numero di elementi in una sequenza senza forzare un'enumerazione.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Suddivide gli elementi di una sequenza in blocchi di una dimensione specificata.
Enumerable.MaxBy e Enumerable.MinBy Trova elementi massimi o minimi usando un selettore di tasti.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy e Enumerable.UnionBy Queste nuove varianti di metodi che eseguono operazioni basate su set consentono di specificare l'uguaglianza usando una funzione del selettore di chiave.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) e Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Accetta gli indici conteggiati dall'inizio o dalla fine della sequenza, ad esempio Enumerable.Range(1, 10).ElementAt(^2) restituisce 9.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) e Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) e Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) e Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
I nuovi overload consentono di specificare un valore predefinito da usare se la sequenza è vuota.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) e Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) I nuovi overload consentono di specificare un operatore di confronto.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Accetta un argomento Range per semplificare l'acquisizione di una sezione di una sequenza, ad esempio è possibile usare source.Take(2..7) anziché source.Take(7).Skip(2).
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Produce una sequenza di tuple con elementi da tre sequenze specificate.

Miglioramenti a data, ora e fuso orario

In .NET 6 sono stati aggiunti i due struct seguenti: System.DateOnly e System.TimeOnly. Rappresentano rispettivamente la parte relativa alla data e la parte relativa all'ora di un DateTime. DateOnly è utile per compleanni e anniversari e TimeOnly è utile per avvisi giornalieri e orari di ufficio settimanali.

È ora possibile usare gli ID del fuso orario di Windows o IANA (Internet Assigned Numbers Authority) in qualsiasi sistema operativo in cui sono installati i dati del fuso orario. Il metodo TimeZoneInfo.FindSystemTimeZoneById(String) è stato aggiornato per convertire automaticamente l'input da un fuso orario di Windows a un fuso orario IANA (o viceversa) se il fuso orario richiesto non viene trovato nel sistema. I nuovi metodi TryConvertIanaIdToWindowsId(String, String) e TryConvertWindowsIdToIanaId sono stati inoltre aggiunti per gli scenari in cui è comunque necessario eseguire manualmente la conversione da un formato di fuso orario a un altro.

Sono stati apportati anche altri miglioramenti al fuso orario. Per altre informazioni, vedere Miglioramenti relativi a data, ora e fuso orario in .NET 6.

Classe PriorityQueue

La nuova classe PriorityQueue<TElement,TPriority> rappresenta una raccolta di elementi con un valore e una priorità. Gli elementi vengono rimossi dalla coda in ordine di priorità crescente, ovvero l'elemento con il valore di priorità più basso viene rimosso per primo dalla coda. Questa classe implementa una struttura dei dati min heap.

Vedi anche