
C# 14 inclut les nouvelles fonctionnalités suivantes : Membres de l’extension, Mot clé field, Conversions de portée implicites, Types génériques non liés et nameof, Paramètres lambda simples avec modificateurs, Plus de membres partiels, Affectation conditionnelle nulle. Vous pouvez essayer ces fonctionnalités à l’aide de la dernière version de Visual Studio 2022 ou du Kit de développement logiciel (SDK) .NET 10.
Le langage en C# constitue le langage le plus connu pour la plateforme .NET, un environnement de développement gratuit, open source et multiplateforme. Les programmes en C# peuvent s’exécuter sur plusieurs appareils différents, des appareils Internet des objets (IoT) au cloud et partout entre les deux. Vous pouvez écrire des applications pour les téléphones, les appareils de bureau, les ordinateurs portables et les serveurs.
De nouvelles fonctionnalités sont disponible pour C#14 et vous pouvez essayer ces fonctionnalités à l’aide de la dernière version de Visual Studio 2022 ou du Kit de développement logiciel (SDK) .NET 10. Voici les nouvelles fonctionnalités suivantes de C#14 :
- Membres de l’extension
- Affectation par condition nulle
- nameof prend en charge les types génériques non liés
- Conversions implicites supplémentaires pour Span<T> et ReadOnlySpan<T>
- Modificateurs sur des paramètres lambda simples
- Propriétés field stockées
- Événements et constructeurs partial
Membres de l’extension
C# 14 ajoute une nouvelle syntaxe pour définir des membres d’extension. La nouvelle syntaxe vous permet de déclarer des propriétés d’extension en plus des méthodes d’extension. Vous pouvez également déclarer des membres d’extension qui étendent le type, plutôt qu’une instance du type. En d’autres termes, ces nouveaux membres d’extension peuvent apparaître en tant que membres statiques du type que vous étendez. L’exemple de code suivant montre un exemple des différents types de membres d’extension que vous pouvez déclarer :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public static class Enumerable { // Extension block extension<TSource>(IEnumerable<TSource> source) // extension members for IEnumerable<TSource> { // Extension property: public bool IsEmpty => !source.Any(); // Extension indexer: public TSource this[int index] => source.Skip(index).First(); // Extension method: public IEnumerable<TSource> Where(Func<TSource, bool> predicate) { ... } } // extension block, with a receiver type only extension<TSource>(IEnumerable<TSource>) // static extension members for IEnumerable<Source> { // static extension method: public static IEnumerable<TSource> Combine(IEnumerable<TSource> first, IEnumerable<TSource> second) { ... } // static extension property: public static IEnumerable<TSource> Identity => Enumerable.Empty<TSource>(); } } |
Les membres du premier bloc d’extension sont appelés comme s’ils sont des membres d’instance de IEnumerable<TSource>, par exemple sequence.IsEmpty. Les membres du deuxième bloc d’extension sont appelés comme s’ils sont des membres statiques de IEnumerable<TSource>, par exemple IEnumerable<int>.Identity.
Mot clé field
Le jeton field vous permet d’écrire un corps d’accesseur de propriété sans déclarer de champ de stockage explicite. Le jeton field est remplacé par un champ de stockage synthétisé par un compilateur.
Par exemple, auparavant, si vous souhaitiez vous assurer qu’une propriété string ne pouvait pas être définie sur null, vous deviez déclarer un champ de stockage et implémenter les deux accesseurs.
Code : | Sélectionner tout |
1 2 3 4 5 6 | private string _msg; public string Message { get => _msg; set => _msg = value ?? throw new ArgumentNullException(nameof(value)); } |
Vous pouvez maintenant simplifier votre code pour :
Code : | Sélectionner tout |
1 2 3 4 5 | public string Message { get; set => field = value ?? throw new ArgumentNullException(nameof(value)); } |
Vous pouvez déclarer un corps pour un accesseur ou les deux accesseurs d’une propriété stockée dans un champ.
Il existe un risque de changement cassant ou de confusion lors de la lecture de code dans les types qui incluent également un symbole nommé field. Vous pouvez utiliser @field ou this.field lever l’ambiguïté entre le field mot clé et l’identificateur, ou renommer le symbole actuel field pour fournir une meilleure distinction.
Le mot clé contextuel field est en C# 13 comme fonctionnalité d’aperçu.
Conversions de portée implicites
C# 14 introduit la prise en charge de première classe pour System.Span<T> et System.ReadOnlySpan<T> dans le langage. Cette prise en charge implique de nouvelles conversions implicites permettant une programmation plus naturelle avec ces types.
Span<T> et ReadOnlySpan<T> sont utilisés de nombreuses façons clés en C# et au runtime. Leur introduction améliore les performances sans risquer la sécurité. C# 14 reconnaît la relation et prend en charge certaines conversions entre ReadOnlySpan<T>, Span<T> et
T[]. Les types d’étendues peuvent être des récepteurs de méthode d’extension, se combiner avec d’autres conversions et faciliter des scénarios d’inférence de types génériques.
Types génériques non liés et nameof
À partir de C# 14, l’argument à nameof peut être un type générique non lié. Par exemple, nameof(List<>

Paramètres lambda simples avec modificateurs
Vous pouvez ajouter des modificateurs de paramètre, tels que scoped, refin, out ou ref readonly à des paramètres d’expression lambda sans spécifier le type de paramètre :
Code : | Sélectionner tout |
1 2 3 | delegate bool TryParse<T>(string text, out T result); // ... TryParse<int> parse1 = (text, out result) => Int32.TryParse(text, out result); |
Auparavant, l’ajout de modificateurs n’était autorisé que lorsque les déclarations de paramètres incluaient les types des paramètres. La déclaration précédente nécessite des types sur tous les paramètres :
Code : | Sélectionner tout |
TryParse<int> parse2 = (string text, out int result) => Int32.TryParse(text, out result);
Le params modificateur nécessite toujours une liste de paramètres typée explicitement.
Plus de membres partiels
Vous pouvez maintenant déclarer les constructeurs d’instances et les événements en tant que membres partiels.
Les constructeurs partiels et les événements partiels doivent inclure exactement une déclaration de définition et une déclaration d’implémentation.
Seule la déclaration d’implémentation d’un constructeur partiel peut inclure un initialiseur de constructeur : this() ou base(). Une seule déclaration de type partiel peut inclure la syntaxe du constructeur principal.
La déclaration d’implémentation d’un événement partiel doit inclure les accesseurs add et remove. La déclaration de définition déclare un événement de type champ.
Affectation conditionnelle nulle
Les opérateurs d’accès de membre conditionnel null, ?. et ?[], peuvent désormais être utilisés sur le côté gauche d'une affectation ou d'une affectation composée.
Avant C# 14, vous devez vérifier null une variable avant de l’affecter à une propriété :
Code : | Sélectionner tout |
1 2 3 4 | if (customer is not null) { customer.Order = GetCurrentOrder(); } |
Vous pouvez simplifier le code précédent à l’aide de l’opérateur ?. :
Code : | Sélectionner tout |
customer?.Order = GetCurrentOrder();
Le côté droit de l’opérateur = est évalué uniquement lorsque le côté gauche n’est pas null. Si customer est nul, le code n’appelle pas GetCurrentOrder.
En plus de l’affectation, vous pouvez utiliser des opérateurs d’accès membre conditionnel null avec des opérateurs d’affectation composée (+= et -= d’autres). Cependant, l'incrémentation et la décrémentation, ++ et --, ne sont pas autorisées.
Source : Microsoft
Et vous ?


Voir aussi :


Vous avez lu gratuitement 10 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.