Un premier aperçu de C# 11

Par:
fredericmazue

mer, 23/02/2022 - 12:36

Microsoft indique que Visual Studio 17.1 (Visual Studio 2022 Update 1) et .NET SDK 6.0.200 incluent des fonctionnalités d'aperçu pour C# 11 ! Vous pouvez mettre à jour Visual Studio ou télécharger le dernier SDK .NET pour obtenir ces fonctionnalités. Voici quelques-unes des nouveautés de C# 11

Les retours à la ligne sont autorisés dans les "trous" des chaînes interpolées

C# prend en charge deux styles de chaînes interpolées : les chaînes interpolées textuelles et non textuelles ($@""et $""respectivement). Une différence clé entre ceux-ci est qu'une chaîne interpolée non verbatim ne peut pas contenir de nouvelles lignes dans ses segments de texte et doit à la place utiliser des échappements (comme rn). Une chaîne interpolée verbatim peut contenir des retours à la ligne dans ses segments de texte et n'échappe pasles retours à la ligne ou d'autres caractères (à l'exception de "" pour échapper un guillemet lui-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 manière abrégée de dire des expressions d'interpolation et sont les parties à 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/de retour à la ligne des segments de texte de chaîne interpolés.

Par exemple, ce qui suit aurait entraîné une erreur de compilation dans C# 10 est légal dans cet aperçu de C# 11 :

var v = $"Count ist: { this.Is.Really.Something()
                            .That.I.Should(
                                be + able)[
                                   to.Wrap()] }.";

Un nouveau motif de liste (List pattern)

Le nouveau motif de liste vous permet de faire correspondre 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 des motif de tranches, vous pouvez supprimer ou capturer zéro ou plusieurs éléments.

La syntaxe pour les motifs de liste est constituée de valeurs entourées de crochets et pour le motif de tranche, il s'agit de deux points. Le motif de tranche peut être suivi d'un autre motif de liste, tel que le motif var pour capturer le contenu de la tranche.

Le motif [1, 2, .., 10] correspond à toutes les possibilités suivantes :

int[] arr1 = { 1, 2, 10 };
int[] arr1 = { 1, 2, 5, 10 };
int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 };

Pour explorer les motifs de liste, considérez :

public static int CheckSwitch(int[] values)
    => values switch
    {
        [1, 2, .., 10] => 1,
        [1, 2] => 2,
        [1, _] => 3,
        [1, ..] => 4,
        [..] => 50
    };

 

Quand on passe au code ci-dessus les tableaux suivants, les résultats sont comme indiqué ci-dessous :

WriteLine(CheckSwitch(new[] { 1, 2, 10 }));          // écrit 1
WriteLine(CheckSwitch(new[] { 1, 2, 7, 3, 3, 10 })); // écrit 1
WriteLine(CheckSwitch(new[] { 1, 2 }));              // écrit 2
WriteLine(CheckSwitch(new[] { 1, 3 }));              // écrit 3
WriteLine(CheckSwitch(new[] { 1, 3, 5 }));           // écrit 4
WriteLine(CheckSwitch(new[] { 2, 5, 6, 7 }));        // écrit 50

Vous pouvez également capturer les résultats d'un motif de tranche :

public static string CaptureSlice(int[] values)
    => values switch
    {
        [1, .. var middle, _] => $"Middle {String.Join(", ", middle)}",
        [.. var all] => $"All {String.Join(", ", all)}"
    };

Les motifs de liste fonctionnent avec n'importe quel type qui est dénombrable et indexable.

Vérification des paramètres null

Il est assez courant de valider si les arguments d'une méthode sont nuls avec du code passe-partout comme :

public static void M(string s)
{
    if (s is null)
    {
        throw new ArgumentNullException(nameof(s));
    }
    // Corps de la méthode
}

Avec la vérification des paramètres null, vous pouvez écrire simplement ceci :

public static void M(string s!!)
{
    // Corp de la méthode
}

Le code pour effectuer la vérification nulle seré généré par le compilateur. Le code de vérification ainsi généré s'exécutera avant tout code dans la méthode. Pour les constructeurs, la vérification se produit avant l'initialisation des champs et les appels aux constructeurs.

Commentaires

C'est marrant mais au fil des versions C# ressemble de plus en plus a Scala. Ca evolue dans la bonne direction. Ca me donnerait presque envie de recommencer à en faire...