Novità di .NET 6

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

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

  • Prestazioni migliori: .NET 6 è il framework Web dello stack completo più veloce, che riduce i costi di calcolo se si esegue nel cloud.

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

.NET 6 sarà supportato per tre anni come versione di 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 e possono essere rimosse in una versione futura. Il nuovo RequiresPreviewFeaturesAttribute viene usato 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, ad esempio FileStream, ottimizzazione guidata dal profilo e compilazione AOT. Per informazioni dettagliate, vedere il post di blog Miglioramenti delle prestazioni in .NET 6 .

FileStream

Il System.IO.FileStream tipo è stato riscritto per .NET 6 per garantire 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 di I/O dei file in .NET 6 .

Ottimizzazione guidata dal profilo

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 pgo dinamico . PgO dinamico funziona manualmente con la compilazione a livelli per ottimizzare ulteriormente il codice in base a strumentazione aggiuntiva che viene messa in atto durante il livello 0. Il PGO dinamico è disabilitato per impostazione predefinita, ma è possibile abilitarlo 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 la compilazione anticipata (AOT) per migliorare il tempo di avvio di un'app. Crossgen2 è 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 arm64

La versione .NET 6 include il supporto per macOS Arm64 (o "Apple Silicon") e i sistemi operativi Windows Arm64, sia per l'esecuzione nativa di Arm64 che per l'emulazione x64. Inoltre, i programmi di installazione x64 e Arm64 .NET ora installano side-by-side. Per altre informazioni, vedere Supporto di .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 di applicare immediatamente tali modifiche all'app in esecuzione. Lo scopo della funzionalità è quello di aumentare la produttività evitando i riavvii delle app tra le modifiche. Il ricaricamento rapido è disponibile in Visual Studio 2022 e nello strumento da dotnet watch riga di comando. Il ricaricamento rapido funziona con la maggior parte dei tipi di app .NET e per il codice sorgente C#, Visual Basic e C++. Per altre informazioni, vedere il post di blog Ricaricamento rapido.

.NET MAUI

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

C# 10 e modelli

C# 10 include innovazioni come global using direttive, 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 implicite global using
  • 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. Tuttavia, il codice esistente non è 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 nell'esperienza di Visual Studio e Windows Forms avvio del progetto.

Carichi di lavoro SDK

Per mantenere le dimensioni di .NET SDK più piccole, alcuni componenti sono stati inseriti in carichi di lavoro SDK nuovi e facoltativi. Questi componenti includono .NET MAUI e Blazor WebAssembly 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 dotnet workload comandi:

Comando Descrizione
Ricerca del carico di lavoro dotnet Cerca i carichi di lavoro disponibili.
installazione del carico di lavoro dotnet Installa un carico di lavoro specificato.
Disinstallazione del carico di lavoro dotnet Rimuove un carico di lavoro specificato.
aggiornamento del carico di lavoro dotnet Aggiornamenti carichi di lavoro installati.
ripristino del carico di lavoro dotnet Reinstalla tutti i carichi di lavoro installati per ripristinare un'installazione interrotta.
elenco di carichi di lavoro dotnet 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 .NET 6, in modo che sia ora una soluzione di serializzazione "forza industriale".

Generatore di origine

.NET 6 aggiunge un nuovo generatore di origine per System.Text.Json. La generazione di origine funziona con JsonSerializer e può essere configurata in diversi modi. Può migliorare le prestazioni, ridurre l'utilizzo della memoria e facilitare il taglio degli assembly. Per altre informazioni, vedere Come scegliere la generazione di reflection o di origine in System.Text.Json e Come usare la generazione di origine 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 anche di passare in modo efficiente a una sottosezione di un albero JSON di grandi dimensioni e di leggere una matrice o deserializzare un poco da tale sottosezione. Sono stati aggiunti i nuovi tipi seguenti per supportare il DOM scrivibile:

Per altre informazioni, vedere Opzioni DOM JSON.

Serializzazione IAsyncEnumerable

System.Text.Json supporta ora la serializzazione e la deserializzazione con IAsyncEnumerable<T> le istanze. I metodi di serializzazione asincroni enumera tutte le IAsyncEnumerable<T> istanze di un oggetto grafico 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 i valori predefiniti:

Per altre informazioni, vedere Callback.

Nuovo attributo di ordinamento delle proprietà:

Nuovo metodo per scrivere json "raw":

Serializzazione sincrona e deserializzazione 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 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, nella compilazione AOT (Ahead-of-Time) per le app WebAssembly Blazor e per le app a pagina singola. Inoltre, è ora possibile eseguire il rendering dei componenti Blazor da JavaScript e integrarsi 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, ovvero una raccolta di strumenti, API e SDK che consentono di analizzare le prestazioni e il comportamento del software. Le API nello System.Diagnostics.Metrics spazio dei nomi implementano la specifica dell'API OpenTelemetry Metrics. Ad esempio, sono disponibili quattro classi di strumenti per supportare diversi scenari di metriche. Le classi di strumenti sono:

Sicurezza

.NET 6 aggiunge il supporto in anteprima per due mitigazioni della sicurezza chiave: Tecnologia di imposizione del flusso di controllo (CET) e "Write Exclusive Execute" (W^X).

CET è una tecnologia Intel disponibile in alcuni processori Intel e AMD più recenti. Aggiunge funzionalità all'hardware che proteggono da alcuni attacchi di hijack del flusso di controllo. .NET 6 offre il 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 solo per impostazione predefinita in Apple Silicon. W^X blocca il percorso di attacco più semplice consentendo alle pagine di memoria di essere scrivibili ed eseguibili contemporaneamente.

Taglio IL

La limitazione delle distribuzioni autonome è stata migliorata. In .NET 5 sono stati eliminati solo gli assembly inutilizzati. .NET 6 aggiunge anche il taglio di tipi e membri inutilizzati. Inoltre, gli avvisi di taglio, che segnalano la posizione in cui il taglio può rimuovere il codice usato in fase di esecuzione, sono ora abilitati per impostazione predefinita. Per altre informazioni, vedere Trim self-contained deployments and executables .For more information, see Trim self-contained deployments and executables.

Analisi codice

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

Guardie della piattaforma personalizzate

L'analizzatore di compatibilità della piattaforma riconosce i Is<Platform> metodi nella OperatingSystem classe , ad esempio , OperatingSystem.IsWindows()come protezioni della piattaforma. Per consentire guardie 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:

Windows Forms

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

I modelli per le app Windows Forms C# sono stati aggiornati per supportare global using direttive, spazi dei nomi con ambito file e tipi riferimento nullable. Includono anche il codice bootstrap dell'applicazione, che riduce il codice boilerplate e consente alla finestra di progettazione di Windows Forms 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(). Inoltre, se si imposta un tipo di carattere non predefinito tramite la proprietà MSBuild ApplicationDefaultFont , ApplicationConfiguration.Initialize() genera una chiamata a SetDefaultFont(Font).

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

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-androidnet6.0-iose net6.0-macos. Per altre informazioni, vedere .NET 5+ TFMs specifico del sistema operativo.

Matematica generica

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

Convalida del pacchetto NuGet

Se si è uno sviluppatore di librerie NuGet, il nuovo strumento di convalida dei pacchetti consente di verificare che i pacchetti siano coerenti e ben formati. È possibile determinare se:

  • Sono state apportate modifiche di rilievo 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 pacchetti .

API reflection

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

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

Microsoft. API delle estensioni

Diversi spazi dei nomi delle estensioni hanno 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 IAsyncDisposable servizio.
Microsoft.Extensions.Hosting I nuovi ConfigureHostOptions metodi semplificano la configurazione dell'applicazione.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging ha un nuovo generatore di origine per le API di registrazione ad alte prestazioni. Il generatore di origine viene attivato se si aggiunge il nuovo LoggerMessageAttribute a un partial metodo di registrazione. In fase di compilazione, il generatore genera l'implementazione del partial metodo, 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 System.Linq.Queryable tipo .

Metodo Descrizione
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Tenta di 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 selettore 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 comparer.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Accetta un Range argomento 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 tupla con elementi di tre sequenze specificate.

Miglioramenti relativi a data, ora e fuso orario

I due struct seguenti sono stati aggiunti in .NET 6: System.DateOnly e System.TimeOnly. Questi rappresentano rispettivamente la parte data e la parte dell'ora di un DateTimeoggetto . DateOnly è utile per compleanni e anniversari, ed TimeOnly è utile per gli allarmi giornalieri e le ore lavorative settimanali.

È ora possibile usare gli ID del fuso orario IANA (Internet Assigned Numbers Authority) o Windows in qualsiasi sistema operativo con i dati del fuso orario installati. Il TimeZoneInfo.FindSystemTimeZoneById(String) metodo è 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. Inoltre, i nuovi metodi TryConvertIanaIdToWindowsId(String, String) e TryConvertWindowsIdToIanaId sono stati aggiunti per gli scenari quando è ancora necessario convertire manualmente da un formato di fuso orario a un altro.

Ci sono anche alcuni altri miglioramenti del fuso orario. Per altre informazioni, vedere Miglioramenti relativi a data, ora e fuso orario in .NET 6.

Classe PriorityQueue

La nuova PriorityQueue<TElement,TPriority> classe rappresenta una raccolta di elementi che hanno sia un valore che una priorità. Gli elementi vengono dequeuati in ordine di priorità crescente, ovvero l'elemento con il valore di priorità più basso viene dequeued prima. Questa classe implementa una struttura di dati min heap .

Vedi anche