Après discussion avec des collègues concernant l'utilisation du mot-clé 'var' en C # 3, je me demandais ce que les gens pensaient des utilisations appropriées de l'inférence de type via var?
Par exemple, j'ai plutôt utilisé paresseusement 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 les plus légitimes de var sont les suivantes: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Fait intéressant, 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.
Il est clair quels seront les résultats dans la mesure où ce sera un type qui implémente IEnumerable, mais ce n'est pas tout à fait évident de la même manière qu'un var déclarant un nouvel objet.
C'est encore pire quand il s'agit de LINQ aux objets, par exemple: -
var results = from item in someList
where item != 3
select item;
Ce n'est pas mieux que l'équivilent foreach (var item dans someList) {// ...} équivilent.
Il y a une réelle inquiétude à propos de la sécurité des types ici - par exemple, si nous devions placer les résultats de cette requête dans une méthode surchargée qui acceptait IEnumerable <int> et IEnumerable <double>, l'appelant pourrait par inadvertance transmettre le mauvais type.
var
ne maintenir typage fort , mais la question est de savoir s'il est dangereux pour le type de ne pas être immédiatement apparent sur la définition, ce qui est magnifié lorsque Surcharges moyennes erreurs du compilateur risquent de ne pas être émis lorsque vous passez accidentellement le mauvais type à une méthode.
var i = 0;
== échouer! var c = new CrazyFrigginLongClassName();
== gagner!
var readabilityBeDamned = true;