Nouveautés de la version 11 de C#

Important

Il s’agit actuellement de fonctionnalités d’évaluation. Vous devez définir <LangVersion> sur preview pour les activer. Chacune d’elles est susceptible de changer avant sa version finale. Elles ne seront pas nécessairement toutes publiées dans la version 11 de C#. Certaines peuvent rester plus longtemps en phase de préversion en fonction des commentaires recueillis.

Les fonctionnalités suivantes sont disponibles dans Visual Studio 2022 version 17.3 :

Les fonctionnalités suivantes sont disponibles dans Visual Studio 2022 version 17.2 :

Les fonctionnalités suivantes sont disponibles dans Visual Studio 2022 version 17.1 :

Vous pouvez télécharger la dernière version de Visual Studio 2022. Sinon, essayez toutes ces fonctionnalités avec la préversion du kit SDK .NET 7, téléchargeable sur la page Tous les téléchargements .NET .

Attributs génériques

Vous pouvez déclarer une classe générique dont la classe de base est System.Attribute. Cette fonctionnalité fournit une syntaxe plus pratique pour les attributs qui nécessitent un System.Type paramètre. Auparavant, il était nécessaire de créer un attribut qui prenait un Type comme paramètre de constructeur :

// Before C# 11:
public class TypeAttribute : Attribute
{
   public TypeAttribute(Type t) => ParamType = t;

   public Type ParamType { get; }
}

Pour appliquer l’attribut, il fallait utiliser l’opérateur typeof :

[TypeAttribute(typeof(string))]
public string Method() => default;

À l’aide de cette nouvelle fonctionnalité, vous pouvez créer plutôt un attribut générique :

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

Ensuite, vous spécifiez le paramètre de type permettant d’utiliser l’attribut :

[GenericAttribute<string>()]
public string Method() => default;

Vous devez fournir tous les paramètres de type lorsque vous appliquez l’attribut. En d’autres termes, le type générique doit être entièrement construit.

public class GenericType<T>
{
   [GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.
   public string Method() => default;
}

Les arguments de type doivent respecter les mêmes restrictions que l’opérateur typeof . Les types qui exigent des annotations de métadonnées ne sont pas autorisés comme paramètres de type, par exemple :

  • dynamic
  • string? (ou tout type référence Nullable)
  • (int X, int Y) (ou tout autre type de tuple suivant la syntaxe de tuple C#)

Ces types ne sont pas directement représentés dans les métadonnées. Ils incluent des annotations qui les décrivent. Dans tous les cas, vous pouvez utiliser le type sous-jacent à la place :

  • object plutôt que dynamic
  • string plutôt que string?.
  • ValueTuple<int, int> plutôt que (int X, int Y).

Prise en charge mathématique générique

Il existe plusieurs fonctionnalités de langage qui activent la prise en charge des mathématiques génériques :

  • static virtual membres dans les interfaces
  • opérateurs définis par l’utilisateur vérifiés
  • opérateurs de décalage détendus
  • opérateur de décalage droit non signé

Vous pouvez ajouter ou static virtual membres static abstract dans des interfaces pour définir des interfaces qui incluent des opérateurs surchargés, d’autres membres statiques et des propriétés statiques. Le scénario principal de cette fonctionnalité consiste à utiliser des opérateurs mathématiques dans des types génériques. Par exemple, vous pouvez implémenter l’interface System.IAdditionOperators<TSelf, TOther, TResult> dans un type qui implémente operator +. D’autres interfaces définissent d’autres opérations mathématiques ou valeurs bien définies. Vous pouvez en savoir plus sur la nouvelle syntaxe de l’article sur les interfaces. Les interfaces qui incluent des static virtual méthodes sont généralement des interfaces génériques. En outre, la plupart déclarent une contrainte que le paramètre de type implémente l’interface déclarée.

Pour plus d’informations ou pour essayer la fonctionnalité vous-même, consultez le tutoriel Exploration des membres abstraits statiques de l’interface ou le billet de blog Fonctionnalités d’évaluation de .NET 6 – Mathématiques génériques.

Les mathématiques génériques ont créé d’autres exigences sur la langue.

  • opérateur de décalage droit non signé : avant C# 11, pour forcer un décalage droit non signé, vous devez convertir un type entier signé en type non signé, effectuer le décalage, puis renvoyer le résultat à un type signé. À compter de C# 11, vous pouvez utiliser l’opérateur >>>de décalage non signé.
  • exigences de l’opérateur de décalage détendu : C# 11 supprime l’exigence selon laquelle le deuxième opérande doit être un int ou implicitement convertible en int. Cette modification permet aux types qui implémentent des interfaces mathématiques génériques à utiliser dans ces emplacements.
  • opérateurs définis par l’utilisateur cochés et non vérifiés : les développeurs peuvent désormais définir checked et unchecked arithmétiques. Le compilateur génère des appels à la variante correcte en fonction du contexte actuel. Vous pouvez en savoir plus sur checked les opérateurs dans l’article sur les opérateurs arithmétiques.

Numérique IntPtr et UIntPtr

Les nint types et alias et System.IntPtrnuintSystem.UIntPtr, respectivement.

Nouvelles lignes dans les interpolations de chaînes

Le texte situé à l’intérieur des caractères { et } d’une interpolation de chaîne peut désormais s’étendre sur plusieurs lignes. Le texte qui se trouve entre les marqueurs { et } est analysé comme du code C#. Tout le code C# valide, y compris les nouvelles lignes, est autorisé. Cette fonctionnalité facilite la lecture des interpolations de chaînes qui utilisent de longues expressions C#, comme les expressions switch de critères spéciaux et les requêtes LINQ.

Pour plus d’informations sur la fonctionnalité de nouvelles lignes, consultez l’article Interpolations de chaînes dans la documentation de référence du langage.

Modèles de liste

Les modèles de liste étendent les critères spéciaux pour intégrer la correspondance avec des séquences d’éléments d’une liste ou d’un tableau. Par exemple, sequence is [1, 2, 3] est true lorsque sequence est un tableau ou une liste de trois entiers (1, 2 et 3). Vous pouvez faire correspondre des éléments à l’aide de n’importe quel modèle, notamment des modèles constants et relationnels et des modèles de type et de propriété. Le modèle discard (_) correspond à n’importe quel élément unique, et le nouveau modèle de plage (..) à n’importe quelle séquence de zéro, un ou plusieurs éléments.

Pour plus d’informations sur les modèles de liste, consultez l’article Critères spéciaux dans la documentation de référence du langage.

Amélioration de la conversion de groupe de méthodes en instance déléguée

Le standard C# des Conversions de groupes de méthodes inclut désormais l’élément suivant :

  • La conversion est autorisée (mais non obligatoire) pour utiliser une instance déléguée existante qui contient déjà ces références.

Les versions précédentes du standard empêchaient le compilateur de réutiliser l’objet délégué créé pour une conversion de groupe de méthodes. Le compilateur de la version 11 de C# le met en cache et le réutilise. Cette fonctionnalité est d’abord disponible dans Visual Studio 17.2 sous forme de fonctionnalité d’évaluation, ainsi que dans .NET 7 preview 2.

Littéraux de chaîne bruts

Les littéraux de chaîne brute constituent un nouveau format pour les littéraux de chaîne. Ils peuvent contenir du texte arbitraire, y compris des espaces blancs, de nouvelles lignes, des guillemets incorporés et d’autres caractères spéciaux, sans nécessiter de séquences d’échappement. Un littéral de chaîne brute commence par au moins trois caractères guillemets doubles ("""). Il se termine par le même nombre de guillemets doubles. En règle générale, il utilise trois guillemets doubles sur une seule ligne pour démarrer la chaîne, et trois guillemets doubles sur une ligne distincte pour la terminer. Les nouvelles lignes qui suivent le devis d’ouverture et qui précèdent le devis de fermeture ne sont pas incluses dans le contenu final :

string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;

Tout espace blanc situé à gauche des guillemets doubles fermants est supprimé du littéral de chaîne. Les littéraux de chaîne brute peuvent être combinés avec l’interpolation de chaîne pour inclure des accolades dans le texte de sortie. Plusieurs caractères $ indiquent le nombre d’accolades consécutives qui commencent et terminent l’interpolation :

var location = $$"""
   You are at {{{Longitude}}, {{Latitude}}}
   """;

L’exemple précédent spécifie que deux accolades commencent et terminent une interpolation. La troisième accolade ouvrante et fermante est incluse dans la chaîne de sortie.

Pour plus d’informations sur les littéraux de chaîne brute, consultez l’article Chaînes dans le guide de programmation, ainsi que les articles Littéraux de chaîne et Chaînes interpolées dans la documentation de référence du langage.

Struct par défaut automatique

Le compilateur C# 11 garantit que tous les champs d’un struct type sont initialisés à leur valeur par défaut dans le cadre de l’exécution d’un constructeur. Cette modification signifie que tout champ ou propriété automatique non initialisé par un constructeur est automatiquement initialisé par le compilateur. Structs où le constructeur n’affecte pas définitivement tous les champs maintenant compilés, et tous les champs non initialisés explicitement sont définis sur leur valeur par défaut. Vous pouvez en savoir plus sur la façon dont cette modification affecte l’initialisation de struct dans l’article sur les structs.

Correspondance de modèle Span<char> ou ReadOnlySpan<char> sur une constante string

Vous avez pu tester si une string valeur constante spécifique avait une valeur constante spécifique à l’aide de la correspondance de modèle pour plusieurs versions. À présent, vous pouvez utiliser la même logique de correspondance de modèle avec des variables qui sont Span<char> ou ReadOnlySpan<char>.

Étendue nameof étendue

Les noms de paramètres de type et les noms de paramètres sont désormais dans l’étendue lorsqu’ils sont utilisés dans une expression dans une nameofdéclaration d’attribut sur cette méthode. Cette fonctionnalité signifie que vous pouvez utiliser l’opérateur nameof pour spécifier le nom d’un paramètre de méthode dans un attribut sur la méthode ou la déclaration de paramètre. Cette fonctionnalité est souvent utile pour ajouter des attributs pour une analyse nullable.

Littéraux de chaîne UTF-8

Vous pouvez spécifier le suffixe sur un littéral de chaîne pour spécifier l’encodage u8 de caractères UTF-8. Si votre application a besoin de chaînes UTF-8, pour des constantes de chaîne HTTP ou des protocoles de texte similaires, vous pouvez utiliser cette fonctionnalité pour simplifier la création de chaînes UTF-8.

Vous pouvez en savoir plus sur les littéraux de chaîne UTF-8 dans la section littéral de chaîne de l’article sur les types de référence intégrés.

Membres nécessaires

Vous pouvez ajouter le required modificateur aux propriétés et aux champs pour appliquer des constructeurs et des appelants pour initialiser ces valeurs. Vous System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute pouvez l’ajouter aux constructeurs pour informer le compilateur qu’un constructeur initialise tous les membres requis.

Pour plus d’informations sur les membres requis, consultez la section init uniquement de l’article des propriétés.