Nouveautés de .NET 6

.NET 6 contient les dernières parties du plan d’unification .NET qui a commencé avec .NET 5. .NET 6 unifie le SDK, les bibliothèques de base et le runtime sur les applications mobiles, les ordinateurs de bureau, l’Internet des objets et le cloud. En plus de cette unification, l’écosystème .NET 6 offre :

  • Développement simplifié : la prise en main est facile. Les nouvelles fonctionnalités de langage en C# 10 réduisent la quantité de code que vous devez écrire. Et les investissements dans la pile web et les API minimales facilitent l’écriture rapide de microservices plus petits et plus rapides.

  • Meilleures performances : .NET 6 est le framework web de pile complète le plus rapide, ce qui réduit les coûts de calcul si vous travaillez dans le cloud.

  • Productivité ultime : .NET 6 et Visual Studio 2022 proposent le rechargement à chaud, de nouveaux outils Git, la modification intelligente du code, des outils de diagnostic et de test robustes et une meilleure collaboration en équipe.

.NET 6 sera pris en charge pendant trois ans en tant que version de support à long terme.

Les fonctionnalités en préversion sont désactivées par défaut. Elles ne sont pas non plus prises en charge pour une utilisation en production et sont susceptibles d’être supprimées dans une version ultérieure. Le nouveau RequiresPreviewFeaturesAttribute est utilisé pour annoter les API en préversion et un analyseur correspondant vous avertit si vous utilisez ces API en préversion.

.NET 6 est pris en charge par Visual Studio 2022 et Visual Studio 2022 pour Mac (et versions ultérieures).

Cet article ne couvre pas toutes les nouvelles fonctionnalités de .NET 6. Pour voir toutes les nouvelles fonctionnalités et pour plus d’informations sur les fonctionnalités répertoriées dans cet article, consultez le billet de blog Annonce de .NET 6.

Performances

.NET 6 comprend de nombreuses améliorations des performances. Cette section répertorie certaines des améliorations apportées à FileStream, à l’optimisation guidée par profil et à la compilation AOA. Pour plus d’informations, consultez le billet de blog sur l’Amélioration des performances de .NET 6.

FileStream

Le type System.IO.FileStream a été réécrit pour .NET 6 afin de fournir de meilleures performances et plus de fiabilité sur Windows. À présent, FileStream ne bloque jamais lors de la création d’E/S asynchrones sur Windows. Pour plus d’informations, consultez les améliorations apportées aux E/S de fichier dans le billet de blog .NET 6.

Optimisation guidée par profil

L’optimisation guidée par profil est l’endroit où le compilateur JIT génère du code optimisé en termes de types et de chemins de code les plus fréquemment utilisés. .NET 6 introduit une optimisation guidée par profil dynamique. L’optimisation guidée par profil dynamique fonctionne main dans la main avec la compilation hiérarchisée pour optimiser davantage le code en fonction de l’instrumentation supplémentaire mise en place pendant le niveau 0. L’optimisation guidée par profil dynamique est désactivée par défaut, mais vous pouvez l’activer avec la DOTNET_TieredPGOvariable d’environnement. Pour plus d’informations, consultez Améliorations des performances JIT.

Crossgen2

.NET 6 contient Crossgen2, le successeur de Crossgen, qui a été supprimé. Crossgen et Crossgen2 sont des outils qui fournissent une compilation anticipée (AOA) pour améliorer le temps de démarrage des applications. Crossgen2 est écrit en C# au lieu de C++ et peut effectuer des analyses et des optimisations qui n’étaient pas possibles avec la version précédente. Pour plus d’informations, consultez Conversation sur Crossgen2.

Prise en charge d’Arm64

La version .NET 6 inclut la prise en charge de macOS Arm64 (ou « Apple Silicon ») et des systèmes d’exploitation Windows Arm64 pour l’exécution native d’Arm64 et l’émulation x64. En outre, les programmes d’installation x64 et Arm64 .NET s’installent désormais côte à côte. Pour plus d’informations, consultez Prise en charge de .NET pour macOS 11 et Windows 11 pour Arm64 et x64.

Rechargement à chaud

Le rechargement à chaud est une fonctionnalité qui vous permet de modifier le code source de votre application et d’appliquer instantanément ces modifications à l’application en cours d’exécution. L’objectif de la fonctionnalité est d’augmenter votre productivité en évitant les redémarrages d’applications entre les modifications. Le rechargement à chaud est disponible dans Visual Studio 2022 et l’outil dotnet watch en ligne de commande. Le rechargement à chaud fonctionne avec la plupart des types d’applications .NET et pour le code source C#, Visual Basic et C++. Pour plus d’informations, consultez le billet de blog sur le rechargement à chaud.

.NET MAUI

L’interface utilisateur de l’application multiplateforme .NET (.NET MAUI) est toujours en préversion, avec une version Release Candidate au premier trimestre 2022 et en disponibilité générale au deuxième trimestre 2022. .NET MAUI permet de créer des applications clientes natives pour les systèmes d’exploitation mobiles et de bureau avec une base de code unique. Pour plus d’informations, consultez le billet de blog Mise à jour des interfaces utilisateur des applications multiplateformes .NET.

C# 10 et modèles

C# 10 comprend différentes innovations telles que des directives global using, des déclarations d’espace de noms limitées aux fichiers et des structs d’enregistrement. Pour plus d’informations, consultez Nouveautés de C# 10.

En concert avec ce travail, les modèles de projet du SDK .NET pour C# ont été modernisés pour utiliser certaines des nouvelles fonctionnalités de langage :

  • Méthode async Main
  • Instructions de niveau supérieur
  • Nouvelles expressions typées cibles
  • Directives global using implicites
  • Espaces de noms limités aux fichiers
  • Types références Nullables

En ajoutant ces nouvelles fonctionnalités de langage aux modèles de projet, le nouveau code commence par les fonctionnalités activées. Toutefois, le code existant n’est pas affecté lorsque vous effectuez une mise à niveau vers .NET 6. Pour plus d’informations sur ces modifications de modèle, consultez le billet de blog Modernisation des modèles de projet C# pour le SDK .NET.

F# et Visual Basic

F# 6 ajoute plusieurs améliorations au langage F# et F# Interactive. Pour plus d’informations, consultez Nouveautés de F# 6.

Visual Basic apporte des améliorations à l’expérience Visual Studio et au démarrage du projet Windows Forms.

Charges du SDK

Pour réduire la taille du SDK .NET, certains composants ont été placés dans de nouvelles charges de travail SDK facultatives. Ces composants incluent .NET MAUI et Blazor WebAssembly AOA. Si vous utilisez Visual Studio, il s’occupe de l’installation des charges de travail du SDK dont vous avez besoin. Si vous utilisez l’interface CLI .NET, vous pouvez gérer les charges de travail à l’aide des nouvelles commandes dotnet workload :

Commande Description
dotnet workload search Recherche les charges de travail disponibles.
dotnet workload install Installe une charge de travail spécifiée.
dotnet workload uninstall Supprime une charge de travail spécifiée.
dotnet workload update Met à jour les charges de travail installées.
dotnet workload repair Réinstalle toutes les charges de travail installées pour réparer une installation interrompue.
dotnet workload list Répertorie les charges de travail installées.

Pour plus d’informations, consultez Charges de travail facultatives du SDK.

System.Text.Json APIs

De nombreuses améliorations ont été apportées dans System.Text.Json dans .NET 6, de sorte qu’il s’agit maintenant d’une solution de sérialisation de capacité industrielle.

Générateur de source

.NET 6 ajoute un nouveau générateur de source pour System.Text.Json. La génération de source fonctionne avec JsonSerializer et peut être configurée de plusieurs façons. Elle peut améliorer les performances, réduire l’utilisation de la mémoire et faciliter le découpage des assemblys. Pour plus d’informations, consultez Comment choisir la génération de réflexion ou de source dans System.Text.Json et Comment utiliser la génération de source dans System.Text.Json.

DOM accessible en écriture

Un nouveau modèle DOM (Document Object Model) accessible en écriture a été ajouté, ce qui complète le DOM en lecture seule préexistante. La nouvelle API fournit une alternative de sérialisation légère pour les cas où l’utilisation de types d’anciens objets CLR (OCT) bruts n’est pas possible. Il vous permet également d’accéder efficacement à une sous-section d’une grande arborescence JSON et de lire un tableau ou désérialiser un OCT à partir de cette sous-section. Les nouveaux types suivants ont été ajoutés pour prendre en charge le DOM accessible en écriture :

Pour plus d’informations, consultez Options DOM JSON.

Sérialisation IAsyncEnumerable

System.Text.Json prend désormais en charge la sérialisation et la désérialisation avec des instances IAsyncEnumerable<T>. Les méthodes de sérialisation asynchrone énumèrent les instances IAsyncEnumerable<T> d’un graphe d’objets, puis les sérialisent en tant que tableaux JSON. Pour la désérialisation, la nouvelle méthode JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) a été ajoutée. Pour plus d’informations, consultez sérialisation IAsyncEnumerable.

Autres nouvelles API

Nouvelles interfaces de sérialisation pour la validation et les valeurs par défaut :

Pour plus d’informations, consultez Rappels.

Nouvel attribut de classement des propriétés :

Nouvelle méthode pour écrire le JSON « brut » :

Sérialisation synchrone et désérialisation dans un flux :

Nouvelle option permettant d’ignorer un objet lorsqu’un cycle de référence est détecté lors de la sérialisation :

Pour plus d’informations sur la sérialisation et la désérialisation avec System.Text.Json, consultez Sérialisation et désérialisation JSON dans .NET.

HTTP/3

.NET 6 inclut la prise en charge de la préversion pour HTTP/3, une nouvelle version de HTTP. HTTP/3 résout certains problèmes de fonctionnement et de performances à l’aide d’un nouveau protocole de connexion sous-jacent appelé QUIC. QUIC établit les connexions plus rapidement et ces connexions sont indépendantes de l’adresse IP, ce qui permet aux clients mobiles de naviguer entre les réseaux Wi-Fi et cellulaires. Pour plus d’informations, consultez Utiliser HTTP/3 avec HttpClient.

ASP.NET Core

ASP.NET Core inclut des améliorations dans les API minimales, la compilation anticipée (AOA) pour les applications Blazor WebAssembly et les applications monopage. De plus, les composants Blazor peuvent désormais être affichés à partir de JavaScript et intégrés à des applications JavaScript existantes. Pour plus d’informations, consultez Nouveautés de ASP.NET Core 6.

OpenTelemetry

.NET 6 offre une prise en charge améliorée d’OpenTelemetry, qui est une collection d’outils, d’API et de SDK qui vous aident à analyser les performances et le comportement de votre logiciel. Les API de l’espace de noms System.Diagnostics.Metrics implémentent la spécification de l’API de mesures OpenTelemetry. Par exemple, il existe quatre classes d’instrument pour prendre en charge différents scénarios de mesures. Les classes d’instrument sont les suivantes :

Sécurité

.NET 6 ajoute la prise en charge de la préversion pour deux atténuations de sécurité clés : la technologie d’application du flux de contrôle (CET) et l’exécution exclusive en écriture (W^X).

CET est une technologie Intel disponible dans certains processeurs Intel et AMD récents. Elle ajoute des fonctionnalités au matériel qui le protègent de certaines attaques de détournement de flux de contrôle. .NET 6 prend en charge CET pour les applications Windows x64 et vous devez l’activer explicitement. Pour plus d’informations, consultez Compatibilité de .NET 6 avec les piles d’ombres INTEL CET.

W^X est disponible sur tous les systèmes d’exploitation avec .NET 6, mais est activé uniquement par défaut sur Apple Silicon. W^X bloque le chemin d’attaque le plus simple en désallouant les pages de mémoire pour qu’elles soient en même temps accessible en écriture et exécutables.

Découpage IL

Le découpage des déploiements autonomes est amélioré. Dans .NET 5, seuls les assemblys inutilisés étaient découpés. .NET 6 ajoute également le découpage des types et membres inutilisés. En outre, les avertissements de découpage, qui vous alertent sur les endroits où le découpage peut supprimer le code utilisé au moment de l’exécution, sont désormais activés par défaut. Pour plus d’informations, consultez Découper les déploiements autonomes et les exécutables.

Analyse du code

Le SDK .NET 6 comprend quelques nouveaux analyseurs de code qui concernent la compatibilité des API, la compatibilité de la plateforme, la sécurité du découpage, l’utilisation de l’étendue dans la concaténation de chaînes et le fractionnement, des API de chaîne plus rapides et des API de collecte plus rapides. Pour obtenir la liste complète des nouveaux analyseurs (et de ceux qui ont été supprimés), consultez Versions de l’analyseur - .NET 6.

Protection de plateforme personnalisées

L’analyseur de compatibilité de plateforme reconnaît les méthodes Is<Platform> de la classe OperatingSystem, par exemple OperatingSystem.IsWindows() en tant que protections de plateforme. Pour autoriser les protections de plateforme personnalisées, .NET 6 introduit deux nouveaux attributs que vous pouvez utiliser pour annoter les champs, les propriétés ou les méthodes avec un nom de plateforme pris en charge ou non :

Windows Forms

Application.SetDefaultFont(Font) est une nouvelle méthode dans .NET 6 qui définit la police par défaut sur votre application.

Les modèles pour les applications Windows Forms C# ont été mis à jour pour prendre en charge les directives, les espaces de noms délimités aux fichiers et les types de référence nulles global using. En outre, ils comprennent le code de démarrage de l’application, ce qui réduit le code réutilisable et permet au concepteur Windows Forms d’afficher l’aire de conception dans la police préférée. Le code d’amorçage est un appel à ApplicationConfiguration.Initialize(), qui est une méthode générée par la source qui émet des appels vers d’autres méthodes de configuration, telles que Application.EnableVisualStyles(). En outre, si vous définissez une police non par défaut via la propriété MSBuild ApplicationDefaultFont, ApplicationConfiguration.Initialize() émet un appel vers SetDefaultFont(Font).

Pour plus d’informations, consultez le billet de blog Nouveautés de Windows Forms.

Build source

Le tarball source, qui contient toutes les sources pour le SDK .NET, est désormais un produit de la build SDK .NET. D’autres organisations, telles que Red Hat, peuvent créer leur propre version du SDK à l’aide de ce tarball source.

Monikers du framework cible

D’autres monikers de framework cible spécifiques à chaque système d’exploitation ont été ajoutés pour .NET 6, par exemple, net6.0-android, net6.0-ios et net6.0-macos. Pour plus d’informations, consultez Moniker de framework cible spécifiques au système d’exploitation .NET 5+.

Mathématiques génériques

Dans le préversion, vous pouvez utiliser des opérateurs sur des types génériques dans .NET 6. .NET 6 introduit de nombreuses interfaces qui utilisent la nouvelle fonctionnalité en préversion de C# 10, membres de l’interface static abstract. Ces interfaces correspondent à différents opérateurs, par exemple, IAdditionOperators représente l’opérateur +. Ces interfaces sont disponibles dans le package NuGet System.Runtime.Experimental. Pour plus d’informations, consultez le billet de blog sur les mathématiques génériques.

Validation du package NuGet

Si vous êtes développeur de bibliothèque NuGet, de nouveaux outils de validation de package vous permettent de vérifier que vos packages sont cohérents et bien formés. Vous pouvez déterminer si :

  • Il existe des changements cassants entre les versions du package.
  • Le package a le même ensemble d’API publiques pour toutes les implémentations spécifiques au runtime.
  • Il y a certaines lacunes pour l’infrastructure cible ou l’applicabilité du runtime.

Pour plus d’informations, consultez le billet de blog Validation de package.

API de réflexion

.NET 6 présente les nouvelles API suivantes qui inspectent le code et fournissent des informations de nullabilité :

Ces API sont utiles pour les outils et les sérialiseurs basés sur la réflexion.

API Microsoft.Extensions

Plusieurs espaces de noms d’extensions ont été améliorés dans .NET 6, comme le montre le tableau suivant.

Espace de noms Améliorations
Microsoft.Extensions.DependencyInjection CreateAsyncScope vous permet d’utiliser en toute sécurité une instruction using pour un fournisseur de services qui inscrit un service IAsyncDisposable.
Microsoft.Extensions.Hosting De nouvelles méthodes ConfigureHostOptions simplifient la configuration de l’application.
Microsoft.Extensions.Logging Microsoft.Extensions.Logging dispose d’un nouveau générateur source pour des API de journalisation performantes. Le générateur source est déclenché si vous ajoutez le nouveau LoggerMessageAttribute à une méthode de journalisation partial. Au moment de la compilation, le générateur génère l’implémentation de la méthode partial, qui est généralement plus rapide au moment de l’exécution que les solutions de journalisation existantes. Pour plus d’informations, consultez Génération de source de journalisation au moment de la compilation.

Nouvelles API LINQ

De nombreuses méthodes LINQ ont été ajoutées dans .NET 6. La plupart des nouvelles méthodes répertoriées dans le tableau suivant ont des méthodes équivalentes dans le type System.Linq.Queryable.

Méthode Description
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) Tente de déterminer le nombre d’éléments d’une séquence sans forcer une énumération.
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) Fractionne les éléments d’une séquence en blocs de la taille spécifiée.
Enumerable.MaxBy et Enumerable.MinBy Recherche des éléments maximum ou minimum à l’aide d’un sélecteur de clé.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy et Enumerable.UnionBy Ces nouvelles variantes de méthodes qui effectuent des opérations basées sur des ensembles vous permettent de spécifier l’égalité à l’aide d’une fonction de sélecteur de clé.
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index) et Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) Accepte les index comptés à partir du début ou de la fin de la séquence, par exemple, Enumerable.Range(1, 10).ElementAt(^2) retourne 9.
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource) et Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource) et Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource) et Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
De nouvelles surcharges vous permettent de spécifier une valeur par défaut à utiliser si la séquence est vide.
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) et Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) De nouvelles surcharges vous permettent de spécifier un comparateur.
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) Accepte un argument Range pour simplifier la prise d’une tranche d’une séquence, par exemple, vous pouvez utiliser source.Take(2..7) au lieu de source.Take(7).Skip(2).
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) Produit une séquence de tuples avec des éléments de trois séquences spécifiées.

Améliorations de date, d’heure et de fuseau horaire

Les deux structs suivants ont été ajoutés dans .NET 6 : System.DateOnly et System.TimeOnly. Celles-ci représentent la partie de date et la partie d’heure d’un DateTime, respectivement. DateOnly est utile pour les anniversaires et les anniversaires et TimeOnly est utile pour les alarmes quotidiennes et les heures de bureau hebdomadaires.

Vous pouvez maintenant utiliser les ID de fuseau horaire IANA (Internet Assigned Numbers Authority) ou Windows sur n’importe quel système d’exploitation sur lequel les données de fuseau horaire sont installées. La méthode TimeZoneInfo.FindSystemTimeZoneById(String) a été mise à jour pour convertir automatiquement son entrée d’un fuseau horaire Windows en fuseau horaire IANA (ou inversement) si le fuseau horaire demandé n’est pas trouvé sur le système. En outre, les nouvelles méthodes TryConvertIanaIdToWindowsId(String, String) et TryConvertWindowsIdToIanaId ont été ajoutées pour les scénarios lorsque vous devez toujours convertir manuellement d’un format de fuseau horaire à un autre.

Il existe également quelques autres améliorations de fuseau horaire. Pour plus d’informations, consultez Améliorations de date, d’heure et de fuseau horaire dans .NET 6.

Classe PriorityQueue

La nouvelle classe PriorityQueue<TElement,TPriority> représente une collection d’éléments qui ont à la fois une valeur et une priorité. Les éléments sont mis en file d’attente dans l’ordre de priorité croissant, c’est-à-dire que l’élément avec la valeur de priorité la plus basse est mis en file d’attente en premier. Cette classe implémente une structure de données de tas minimum.

Voir aussi