30 votes

Quel est l'avantage de la var des modèles en C#7?

Je ne comprends pas le cas d'utilisation d' var des modèles dans C#7. MSDN:

Un motif correspondance avec l' var modèle réussit toujours. Sa syntaxe est

expr is var varname

lorsque la valeur de expr est toujours assignée à une variable locale nommée varname. varname est une variable statique du même type que expr.

L'exemple sur MSDN est assez inutile à mon avis, surtout parce que l' if est redondant:

object[] items = { new Book("The Tempest"), new Person("John") };
foreach (var item in items) {
  if (item is var obj)
    Console.WriteLine($"Type: {obj.GetType().Name}, Value: {obj}"); 
}

Ici, je ne vois pas d'avantages, vous pourriez avoir le même si vous avez accès à la variable de boucle item directement, ce qui est aussi de type Object. L' if est source de confusion, car il n'est jamais false.

Je pourrais utiliser var otherItem = item ou utiliser item diectly. Quelqu'un peut m'expliquer le cas d'utilisation de mieux?

17voto

poke Points 64398

Le var pattern a été très souvent abordé dans le langage C# référentiel donné qu'il n'est pas parfaitement clair que son cas d'utilisation et le fait qu' is var x n'est pas null vérifier en is T x ne, ce qui semble plutôt inutile.

Cependant, il n'est pas réellement destiné à être utilisé comme obj is var x. Il est destiné à être utilisé lors de la gauche n'est pas une variable sur son propre.

Voici quelques exemples à partir de la spécification. Elles utilisent toutes les fonctionnalités qui ne sont pas en C# encore , mais cela montre simplement que l'introduction de la var pattern a été essentiellement faite en préparation pour ces choses, afin qu'ils ne pas avoir à toucher à nouveau plus tard.

L'exemple suivant déclare une fonction Deriv de construire la dérivée d'une fonction à l'aide structurelle d'un patron sur une arborescence d'expression:

Expr Deriv(Expr e)
{
    switch (e) {
        // …
        case Const(_): return Const(0);
        case Add(var Left, var Right):
            return Add(Deriv(Left), Deriv(Right));
        // …
}

Ici, l' var modèle peut être utilisé à l'intérieur des structures de "sortir" des éléments de la structure. De même, l'exemple suivant simplifie l'expression:

Expr Simplify(Expr e)
{
    switch (e) {
        case Mult(Const(0), _): return Const(0);
        // …
        case Add(Const(0), var x): return Simplify(x);
    }
}

Comme gafter écrit ici, l'idée est aussi d'avoir la propriété du filtrage, permettant la suivante:

if (o is Point {X is 3, Y is var y})
{ … }

14voto

Panagiotis Kanavos Points 14085

Sans contrôle de la conception de notes sur Github j'avais suppose que cela a été ajouté plus de cohérence avec switch et comme un tremplin pour plus avancées de filtrage des cas,

À partir de l'original des nouveautés de C# 7.0 post :

Var modèles de la forme var x (où x est un identificateur), qui correspondent toujours, et il suffit de mettre la valeur de l'entrée dans une nouvelle variable x avec le même type que l'entrée.

Et la récente dissection post par Sergey Teplyakov :

si vous savez exactement ce qui se passe, vous pouvez trouver ce modèle utile. Il peut être utilisé pour l'introduction d'une variable temporaire à l'intérieur de l'expression: Ce modèle essentiellement crée une variable temporaire en utilisant le type réel de l'objet.

public void VarPattern(IEnumerable<string> s)
{
    if (s.FirstOrDefault(o => o != null) is var v
        && int.TryParse(v, out var n))
    {
        Console.WriteLine(n);
    }
}

L'avertissement righ avant que l'extrait est également significatif:

Il n'est pas clair pourquoi le comportement est différent dans le mode de Libération uniquement. Mais je pense que toutes les questions qui tombe dans le même seau: la mise en œuvre initiale de la fonction est sous-optimale. Mais, sur la base de ce commentaire par Neal Gafter, cela va changer: "Le" pattern-matching " abaissant le code est réécrit à partir de zéro (à l'appui des modèles récursifs, trop). Je suppose que la plupart des améliorations que vous cherchez ici viendra pour "libre" dans le nouveau code. Mais il faudra un certain temps avant que la réécriture est prêt pour le prime time.".

Selon Christian Nagel :

L'avantage est que la variable déclarée avec le mot-clé var est de type réel de l'objet,

1voto

Damien_The_Unbeliever Points 102139

La seule chose que je peux penser de la main gauche est si vous trouvez que vous avez écrit deux blocs identiques de code (en dire un seul switch), un autre pour expr is object a et l'autre pour expr is null.

Vous pouvez combiner les blocs en passant en expr is var a.

Il peut également être utile dans le code de génération de scénarios où, pour quelque raison que ce soit, vous avez déjà écrit vous-même dans un coin et toujours s'attendre à générer un motif de match, mais maintenant vous souhaitez émettre un "tous" modèle.

0voto

Jonas Brandel Points 409

Dans la plupart des cas, il est vrai, le var pattern prestation n'est pas clair, et peut-être même une mauvaise idée. Cependant, comme un moyen de saisir les types anonymes dans la variable temp il fonctionne très bien. Nous espérons que cet exemple peut illustrer cela: La Note ci-dessous, en ajoutant une valeur null évite var jamais être nulles et non nulles de contrôle.

        var sample = new(int id, string name, int age)[] { 
                                                          (1, "jonas", 50),                                                                                                                            
                                                          (2, "frank", 48) };

        var f48 = from s in sample 
                  where s.age == 48 
                  select new { Name = s.name, Age = s.age };

        switch(f48.FirstOrDefault())
        {
            case var choosen when choosen.Name == "frank":
                WriteLine(choosen.Age);
                break;
            case null:
                WriteLine("not found");
                break;
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X