Nouveautés de C# 10

C# 10 ajoute les fonctionnalités et améliorations suivantes au langage C# :

C# 10 est pris en charge sur .NET 6. Pour plus d’informations, consultez contrôle de version du langage C#.

Vous pouvez télécharger la dernière version du kit SDK .NET 6 sur la page de téléchargements .NET. Vous avez également la possibilité de télécharger Visual Studio 2022, qui inclut la version 6 du kit SDK .NET.

Structs d’enregistrement

Vous pouvez déclarer des enregistrements de type valeur à l’aide des déclarations ou readonly record struct desrecord struct déclarations. Vous pouvez maintenant clarifier qu’il record s’agit d’un type référence avec la record class déclaration.

Améliorations des types de structure

C# 10 introduit les améliorations suivantes liées aux types de structure :

  • Vous pouvez déclarer un constructeur sans paramètre d’instance dans un type de structure et initialiser un champ d’instance ou une propriété à sa déclaration. Pour plus d’informations, consultez la section Struct initialisation et valeurs par défaut de l’article Types de structure .
  • Un opérande de gauche de l’expressionwith peut être de n’importe quel type de structure ou d’un type anonyme (référence).

Gestionnaire de chaînes interpolées

Vous pouvez créer un type qui génère la chaîne résultante à partir d’une expression de chaîne interpolée. Les bibliothèques .NET utilisent cette fonctionnalité dans de nombreuses API. Vous pouvez en créer un en suivant ce didacticiel.

Directives d’utilisation globale

Vous pouvez ajouter le global modificateur à n’importe quelle directive using pour indiquer au compilateur que la directive s’applique à tous les fichiers sources de la compilation. Il s’agit généralement de tous les fichiers sources d’un projet.

Déclaration d’espace de noms délimitée à un fichier

Vous pouvez utiliser une nouvelle forme de déclarationnamespace pour déclarer que toutes les déclarations suivantes sont membres de l’espace de noms déclaré :

namespace MyNamespace;

Cette nouvelle syntaxe enregistre à la fois l’espace horizontal et vertical pour namespace les déclarations.

Modèles de propriété étendus

À compter de C# 10, vous pouvez référencer des propriétés ou des champs imbriqués dans un modèle de propriété. Par exemple, un modèle de formulaire

{ Prop1.Prop2: pattern }

est valide en C# 10 et versions ultérieures et équivaut à

{ Prop1: { Prop2: pattern } }

valide en C# 8.0 et versions ultérieures.

Pour plus d’informations, consultez la note de proposition de caractéristique des modèles de propriétés étendues . Pour plus d’informations sur un modèle de propriété, consultez la section Modèle de propriété de l’article Modèles .

Améliorations apportées aux expressions lambda

C# 10 inclut de nombreuses améliorations de la façon dont les expressions lambda sont gérées :

  • Les expressions lambda peuvent avoir un type naturel, où le compilateur peut déduire un type délégué à partir de l’expression lambda ou du groupe de méthodes.
  • Les expressions lambda peuvent déclarer un type de retour lorsque le compilateur ne peut pas le déduire.
  • Les attributs peuvent être appliqués aux expressions lambda.

Ces fonctionnalités rendent les expressions lambda plus similaires aux méthodes et aux fonctions locales. Ils facilitent l’utilisation d’expressions lambda sans déclarer une variable d’un type délégué, et fonctionnent plus facilement avec les nouvelles API ASP.NET Core Minimal.

Chaînes interpolées constantes

En C# 10, const les chaînes peuvent être initialisées à l’aide de l’interpolation de chaîne si tous les espaces réservés sont eux-mêmes des chaînes constantes. L’interpolation de chaîne peut créer des chaînes constantes plus lisibles lorsque vous générez des chaînes constantes utilisées dans votre application. Les expressions d’espace réservé ne peuvent pas être des constantes numériques, car ces constantes sont converties en chaînes au moment de l’exécution. La culture actuelle peut affecter leur représentation sous forme de chaîne. En savoir plus dans la référence de langage sur les const expressions.

Les types d’enregistrements peuvent sceller ToString

En C# 10, vous pouvez ajouter le sealed modificateur lorsque vous remplacez ToString dans un type d’enregistrement. Le scellement de la ToString méthode empêche le compilateur de synthétiser une ToString méthode pour tous les types d’enregistrements dérivés. A sealedToString garantit que tous les types d’enregistrements dérivés utilisent la ToString méthode définie dans un type d’enregistrement de base commun. Vous pouvez en savoir plus sur cette fonctionnalité dans l’article sur les enregistrements.

Affectation et déclaration dans la même déconstruction

Cette modification supprime une restriction des versions antérieures de C#. Auparavant, une déconstruction pouvait affecter toutes les valeurs à des variables existantes ou initialiser les variables nouvellement déclarées :

// Initialization:
(int x, int y) = point;

// assignment:
int x1 = 0;
int y1 = 0;
(x1, y1) = point;

C# 10 supprime cette restriction :

int x = 0;
(x, int y) = point;

Amélioration de l’affectation définie

Avant C# 10, il existait de nombreux scénarios où l’affectation et l’analyse de l’état Null ont produit des avertissements qui étaient des faux positifs. Ces comparaisons impliquent généralement des comparaisons avec des constantes booléennes, l’accès à une variable uniquement dans les true instructions d’une falseif instruction et les expressions de fusion null. Ces exemples ont généré des avertissements dans les versions précédentes de C#, mais pas en C# 10 :

string representation = "N/A";
if ((c != null && c.GetDependentValue(out object obj)) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ?.
if (c?.GetDependentValue(out object obj) == true)
{
   representation = obj.ToString(); // undesired error
}

// Or, using ??
if (c?.GetDependentValue(out object obj) ?? false)
{
   representation = obj.ToString(); // undesired error
}

L’impact principal de cette amélioration est que les avertissements pour l’affectation définitive et l’analyse de l’état Null sont plus précis.

Autoriser l’attribut AsyncMethodBuilder sur les méthodes

En C# 10 et versions ultérieures, vous pouvez spécifier un autre générateur de méthodes asynchrones pour une seule méthode, en plus de spécifier le type de générateur de méthodes pour toutes les méthodes qui retournent un type de type de tâche donné. Un générateur de méthodes asynchrones personnalisé permet des scénarios avancés de réglage des performances où une méthode donnée peut tirer parti d’un générateur personnalisé.

Pour plus d’informations, consultez la section sur AsyncMethodBuilder l’article sur les attributs lus par le compilateur.

Diagnostics d’attribut CallerArgumentExpression

Vous pouvez utiliser pour System.Runtime.CompilerServices.CallerArgumentExpressionAttribute spécifier un paramètre que le compilateur remplace par la représentation textuelle d’un autre argument. Cette fonctionnalité permet aux bibliothèques de créer des diagnostics plus spécifiques. Le code suivant teste une condition. Si la condition est false, le message d’exception contient la représentation textuelle de l’argument passé à condition:

public static void Validate(bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
    if (!condition)
    {
        throw new InvalidOperationException($"Argument failed validation: <{message}>");
    }
}

Vous pouvez en savoir plus sur cette fonctionnalité dans l’article sur les attributs d’informations de l’appelant dans la section de référence du langage.

Pragma #line amélioré

C# 10 prend en charge un nouveau format pour le #line pragma. Vous n’utiliserez probablement pas le nouveau format, mais vous verrez ses effets. Les améliorations permettent une sortie plus précise dans des langages spécifiques au domaine (DSL) comme Razor. Le moteur Razor utilise ces améliorations pour améliorer l’expérience de débogage. Vous trouverez des débogueurs qui peuvent mettre en évidence votre source Razor plus précisément. Pour en savoir plus sur la nouvelle syntaxe, consultez l’article sur les directives de préprocesseur dans la référence du langage. Vous pouvez également lire la spécification de fonctionnalité pour les exemples razor.