Après avoir discuté avec des collègues de l'utilisation du mot-clé "var" en C# 3, je me suis demandé ce que les gens pensaient de l'utilisation appropriée de l'inférence de type via var.
Par exemple, j'ai plutôt paresseusement utilisé var dans des circonstances douteuses, par exemple :-.
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
Les utilisations plus légitimes du var sont les suivantes:-
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Il est intéressant de noter que LINQ semble être un peu une zone grise, par exemple :-.
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Le résultat est clair : il s'agit d'un type qui implémente IEnumerable, mais ce n'est pas aussi évident qu'une var déclarant un nouvel objet.
C'est encore pire lorsqu'il s'agit de LINQ to objects, par exemple :-.
var results = from item in someList
where item != 3
select item;
Ce n'est pas mieux que l'équivalent foreach(var item in someList) { // ... } équivalent.
Il y a un réel problème de sécurité de type ici - par exemple, si nous devions placer les résultats de cette requête dans une méthode surchargée qui accepte IEnumerable<int> et IEnumerable<double>, l'appelant pourrait par inadvertance passer dans le mauvais type.
var
fait maintenir un typage fort, mais la question est vraiment de savoir s'il est dangereux que le type ne soit pas immédiatement apparent lors de la définition, ce qui est amplifié lorsque les surcharges signifient que des erreurs de compilation peuvent ne pas être émises lorsque vous passez involontairement le mauvais type à une méthode.