Microsoft a publié mardi un aperçu premier des nouvelles fonctionnalités de C# 11. Ces nouveautés incluent l'autorisation de nouvelles lignes dans les "trous" des chaînes interpolées, les motifs de liste, la vérification des paramètres null, etc. Selon Microsoft, Visual Studio 17.1 (Visual Studio 2022 Update 1) et .NET SDK 6.0.200 incluent des fonctionnalités de prévisualisation pour C# 11. Vous pouvez mettre à jour Visual Studio ou télécharger la dernière version du SDK .NET pour bénéficier de ces fonctionnalités. En attendant, voici les points forts de ce premier aperçu.Autoriser les nouvelles lignes dans les "trous" des chaînes interpolées
C# supporte deux styles de chaînes interpolées : les chaînes interpolées verbatim et non verbatim ($@"" et $"", respectivement). Selon Kathleen Dollard de Microsoft, l'une des principales différences entre ces deux types de chaînes est qu'une chaîne interpolée non verbatim ne peut pas contenir de nouvelles lignes dans ses segments de texte et doit utiliser des échappatoires (comme rn). Une chaîne interpolée verbatim peut contenir de nouvelles lignes dans ses segments de texte, et n'échappe pas les nouvelles lignes ou tout autre caractère (à l'exception de "" pour échapper à une citation elle-même). Tout ce comportement reste le même.
Auparavant, ces restrictions s'étendaient aux trous des chaînes interpolées non verbatim. Les trous sont une façon abrégée de dire "expressions d'interpolation" et sont les portions à l'intérieur des accolades qui fournissent des valeurs d'exécution. Les trous eux-mêmes ne sont pas du texte, et ne doivent pas être soumis aux règles d'échappement/saut de ligne des segments de texte de la chaîne interpolée. Par exemple, l'exemple suivant aurait entraîné une erreur de compilation en C# 10, mais est autorisé dans cet aperçu de C# 11 :
| Code C# : | Sélectionner tout |
1 2 3 4 | var v = $"Count ist: { this.Is.Really.Something() .That.I.Should( be + able)[ to.Wrap()] }."; |
Selon l'équipe C#, le nouveau motif de liste vous permet d'établir des correspondances avec des listes et des tableaux. Vous pouvez faire correspondre des éléments et éventuellement inclure un motif de tranche qui correspond à zéro ou plusieurs éléments. En utilisant les motifs de tranche, vous pouvez écarter ou capturer zéro ou plusieurs éléments. La syntaxe des motifs de liste est constituée de valeurs entourées de crochets et celle des motifs de tranche de deux points. Le motif de tranche peut être suivi d'un autre motif de liste pour capturer le contenu de la tranche.
Le motif [1, 2, ..., 10] correspond à tous les éléments suivants :
| Code C# : | Sélectionner tout |
1 2 3 | int[] arr1 = { 1, 2, 10 }; int[] arr1 = { 1, 2, 5, 10 }; int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 }; |
| Code C# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | public static int CheckSwitch(int[] values) => values switch { [1, 2, .., 10] => 1, [1, 2] => 2, [1, _] => 3, [1, ..] => 4, [..] => 50 }; |
| Code C# : | Sélectionner tout |
1 2 3 4 5 6 | WriteLine(CheckSwitch(new[] { 1, 2, 10 })); // prints 1 WriteLine(CheckSwitch(new[] { 1, 2, 7, 3, 3, 10 })); // prints 1 WriteLine(CheckSwitch(new[] { 1, 2 })); // prints 2 WriteLine(CheckSwitch(new[] { 1, 3 })); // prints 3 WriteLine(CheckSwitch(new[] { 1, 3, 5 })); // prints 4 WriteLine(CheckSwitch(new[] { 2, 5, 6, 7 })); // prints 50 |
| Code C# : | Sélectionner tout |
1 2 3 4 5 6 | public static string CaptureSlice(int[] values) => values switch { [1, .. var middle, _] => $"Middle {String.Join(", ", middle)}", [.. var all] => $"All {String.Join(", ", all)}" }; |
Vérification des paramètres null
Dollard a déclaré que l'équipe a mis cette fonctionnalité dans ce premier aperçu pour s'assurer qu'elle a le temps de recevoir des commentaires. Selon elle, il y a eu des discussions sur une syntaxe très succincte par rapport à une syntaxe plus verbeuse. « Nous voulons obtenir les commentaires des clients et des utilisateurs qui ont eu la chance d'expérimenter cette fonctionnalité », a-t-elle déclaré. Il est assez courant de valider si les arguments d'une méthode sont null avec des variations de code passe-partout comme :
| Code C# : | Sélectionner tout |
1 2 3 4 5 6 7 8 | public static void M(string s) { if (s is null) { throw new ArgumentNullException(nameof(s)); } // Body of the method } |
| Code C# : | Sélectionner tout |
1 2 3 4 | public static void M(string s!!) { // Body of the method } |
La vérification des paramètres null permet de vérifier plus facilement, au moment de l'exécution, si des valeurs null ont été transmises à votre code. Ceci est particulièrement important lorsque votre code interagit avec du code externe qui peut ne pas avoir de NRT activé. La vérification est similaire à if (param is null) throw new ArgumentNullException(...). Lorsque plusieurs paramètres contiennent l'opérateur !!, les vérifications sont effectuées dans l'ordre de déclaration des paramètres. Il existe quelques directives limitant l'utilisation de l'opérateur !!, notamment :
- les contrôles de nullité ne peuvent être appliqués aux paramètres que lorsqu'il existe une implémentation. Par exemple, un paramètre de méthode abstraite ne peut pas utiliser !!. Parmi les autres cas où il ne peut pas être utilisé, citons : les paramètres de méthodes externes, les paramètres des délégués, les paramètres des méthodes d'interface lorsque la méthode n'est pas une méthode d'interface par défaut (DIM - Default Interface Method) ;
- les contrôles de nullité ne peuvent être appliqués qu'aux paramètres qui peuvent être vérifiés.
Les paramètres de rejet et de sortie sont un exemple de scénarios exclus en vertu de la deuxième règle. Le contrôle des valeurs null peut être effectué sur les paramètres ref et in. La vérification du caractère null est autorisée pour les paramètres de l'indexeur, et la vérification est ajoutée à l'accesseur get et set. Par exemple :...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.
