C# Language déclaration var out


Exemple

Un modèle courant dans C # utilise bool TryParse(object input, out object value) pour analyser en toute sécurité des objets.

La déclaration out var est une fonctionnalité simple pour améliorer la lisibilité. Il permet à une variable d'être déclarée en même temps qu'elle est passée en paramètre out.

Une variable déclarée de cette façon est définie sur le reste du corps au moment où elle est déclarée.

Exemple

En utilisant TryParse avant C # 7.0, vous devez déclarer une variable pour recevoir la valeur avant d'appeler la fonction:

7.0
int value;
if (int.TryParse(input, out value)) 
{
    Foo(value); // ok
}
else
{
    Foo(value); // value is zero
}

Foo(value); // ok

Dans C # 7.0, vous pouvez incorporer la déclaration de la variable transmise au paramètre out , ce qui élimine la nécessité d'une déclaration de variable distincte:

7.0
if (int.TryParse(input, out var value)) 
{
    Foo(value); // ok
}
else
{
    Foo(value); // value is zero
}

Foo(value); // still ok, the value in scope within the remainder of the body

Si certains des paramètres qu'une fonction retourne en out n'est pas nécessaire , vous pouvez utiliser l'opérateur de défausse _ .

p.GetCoordinates(out var x, out _); // I only care about x

Une déclaration out var peut être utilisée avec toute fonction existante qui possède déjà out paramètres. La syntaxe de déclaration de la fonction reste la même et aucune exigence supplémentaire n'est requise pour rendre la fonction compatible avec une déclaration out var . Cette caractéristique est simplement du sucre syntaxique.

Une autre caractéristique de la déclaration out var est qu’elle peut être utilisée avec des types anonymes.

7.0
var a = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var groupedByMod2 = a.Select(x => new
                                  {
                                      Source = x,
                                      Mod2 = x % 2
                                  })
                     .GroupBy(x => x.Mod2)
                     .ToDictionary(g => g.Key, g => g.ToArray());
if (groupedByMod2.TryGetValue(1, out var oddElements))
{
    Console.WriteLine(oddElements.Length);
}

Dans ce code, nous créons un Dictionary avec la clé int et un tableau de valeur de type anonyme. Dans la version précédente de C #, il était impossible d'utiliser la méthode TryGetValue ici, car vous deviez déclarer la variable out (qui est de type anonyme!). Cependant, avec out var il n'est pas nécessaire de spécifier explicitement le type de la variable out .

Limites

Notez que les déclarations var sont d'une utilité limitée dans les requêtes LINQ car les expressions sont interprétées comme des corps d'expression lambda, de sorte que la portée des variables introduites est limitée à ces lambda. Par exemple, le code suivant ne fonctionnera pas:

var nums = 
    from item in seq
    let success = int.TryParse(item, out var tmp)
    select success ? tmp : 0; // Error: The name 'tmp' does not exist in the current context

Les références