Partager via


Nouveautés de .NET 6

.NET 6 fournit 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, de bureau, IoT et 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 dans 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 exécutez dans le cloud.

  • Productivité optimale : .NET 6 et Visual Studio 2022 offrent le rechargement à chaud, de nouveaux outils git, l'édition intelligente du code, des outils de diagnostic et de test robustes et une meilleure collaboration au sein de l'équipe.

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

Les fonctionnalités de prévisualisation sont désactivées par défaut. Ils ne sont pas non plus pris en charge pour une utilisation en production et peuvent être supprimés dans une version ultérieure. La nouvelle RequiresPreviewFeaturesAttribute est utilisée 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 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 inclut 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 améliorations des performances dans .NET 6.

Flux de fichiers

Le type System.IO.FileStream a été réécrit pour .NET 6 afin de fournir de meilleures performances et 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 le billet de blog Améliorations apportées aux E/S de fichiers dans .NET 6.

Optimisation guidée par profil

L’optimisation guidée par profil (PGO) 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. Le PGO dynamique travaille de concert avec la compilation hiérarchisée afin d'optimiser davantage le code sur la base de l’instrumentation supplémentaire mise en place pendant le tier 0. Le PGO dynamique est désactivé par défaut, mais vous pouvez l’activer avec la variable d’environnement DOTNET_TieredPGO. Pour plus d’informations, consultez Améliorations des performances JIT.

Crossgen2

.NET 6 introduit Crossgen2, le successeur de Crossgen, qui a été supprimé. Crossgen et Crossgen2 sont des outils qui fournissent une compilation anticipée (AOT) pour améliorer le temps de démarrage d’une application. Crossgen2 est écrit en C# au lieu de C++, et peut effectuer une analyse et une optimisation qui n’ont pas été 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 rapide

Hot reload est une fonctionnalité qui vous permet de modifier le code source de votre application et d’appliquer instantanément ces modifications à votre application en cours. 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 en ligne de commande dotnet watch. 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 Update on .NET Multiplateform App UI.

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, voir l'historique des versions du langage C#.

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

  • méthode async Main
  • Déclarations 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 l'article de blog SDK .NET : modèles de projet C# modernisés.

F# et Visual Basic

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

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

Charges de travail du Kit de développement logiciel (SDK)

Pour réduire la taille du Kit de développement logiciel (SDK) .NET, certains composants ont été placés dans de nouvelles charges de travail facultatives SDK. Ces composants incluent .NET MAUI et Blazor WebAssembly AOT. Si vous utilisez Visual Studio, il s’occupe de l’installation des charges de travail du Kit de développement logiciel (SDK) dont vous avez besoin. Si vous utilisez leCLI .NET , vous pouvez gérer les charges de travail à l’aide des nouvelles commandes :

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 Mises à jour des 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 source

.NET 6 ajoute un nouveau générateur source pour System.Text.Json. La génération de source fonctionne avec JsonSerializer et peut être configurée de plusieurs façons. Il peut améliorer les performances, réduire l’utilisation de la mémoire et faciliter le découpage d'assemblage. 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 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 (POCO) 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 POCO à 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> dans un graphique 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 défis fonctionnels et de performances existants à l’aide d’un nouveau protocole de connexion sous-jacent appelé QUIC. QUIC établit des connexions plus rapidement et les connexions sont indépendantes de l’adresse IP, ce qui permet aux clients mobiles de se déplacer entre wi-fi et réseaux 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 (AOT) pour les applications Blazor WebAssembly et les applications monopages. De plus, les composants Blazor peuvent désormais être rendus à 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 de openTelemetry, qui est une collection d’outils, d’API et de kits 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 OpenTelemetry Metrics . Par exemple, il existe quatre classes d’instrument pour prendre en charge différents scénarios de métriques. 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 plus récents. Il ajoute des fonctionnalités au matériel qui protègent contre 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 activé uniquement par défaut sur Apple Silicon. W^X bloque le chemin d’attaque le plus simple en interdisant aux pages de mémoire d'être à la fois modifiables et exécutables.

Découpage IL

Le découpage des déploiements autonomes est amélioré. Dans .NET 5, seules les assemblies inutilisées ont été supprimées. .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 Kit de développement logiciel (SDK) .NET 6 inclut 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, les API de chaîne plus rapides et les API de collecte plus rapides. Pour obtenir la liste complète des nouveaux analyseurs (et ceux supprimés), consultez Versions des analyseurs - .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 gardes de plateforme personnalisés, .NET 6 introduit deux nouveaux attributs que vous pouvez utiliser pour annoter des champs, des propriétés ou des méthodes avec un nom de plateforme pris en charge ou non pris en charge :

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 global using, les espaces de noms délimités aux fichiers et les types de référence nullables. En outre, ils incluent le code de démarrage de l’application, qui réduit le code passe-partout et permet au concepteur Windows Forms d’afficher la surface 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 à 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é ApplicationDefaultFont MSBuild, ApplicationConfiguration.Initialize() émet un appel à SetDefaultFont(Font).

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

Build source

L'archive tar source, qui contient toutes les sources du kit SDK .NET, est désormais un produit de la compilation du kit SDK .NET. D’autres organisations, telles que Red Hat, peuvent créer leur propre version du Kit de développement logiciel (SDK) à l’aide de ce tarball source.

Monikers du framework cible

Des monikers de framework cible spécifiques au système d’exploitation (TFMs) supplémentaires ont été ajoutés pour .NET 6, par exemple, net6.0-android, net6.0-ioset 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 présente de nombreuses interfaces qui utilisent les membres d'interface static abstract de la nouvelle fonctionnalité en préversion de C# 10. Ces interfaces correspondent à différents opérateurs, par exemple, IAdditionOperators représente l’opérateur +. Les interfaces sont disponibles dans le package NuGet System.Runtime.Experimental. Pour plus d’informations, consultez le billet de blog mathématiques génériques.

Validation du package NuGet

Si vous êtes développeur de bibliothèques 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 existe des 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 de Microsoft.Extensions

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

Namespace 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 Les 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 la nouvelle 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 d’une taille spécifiée.
Enumerable.MaxBy et Enumerable.MinBy Recherche les éléments maximaux ou minimaux à l’aide d’un sélecteur de clés.
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectByet 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 de naissance et autres anniversaires, et TimeOnly est utile pour les alarmes quotidiennes et les horaires de travail 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 en un autre.

Il y a également quelques autres améliorations des fuseaux horaires. 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