C# 3.0 Best Practices : Utilisation de var
Un collègue qui utilise Resharper m'a demandé aujourd'hui pourquoi Reshaper lui suggérait tout le temps de replacer une déclaration explicite du genre :
StringBuilder sb = new StringBuilder();
en une déclaration implicite en utilisant le mot clé var :
var sb = new StringBuilder();
Je n'utilise pas moi même Resharper et cette suggestion m'a beaucoup surprise.
En cherchant un peu sur internet, je suis tombé sur le blog d'un Product Manager de Resharper (http://resharper.blogspot.com/2007/08/resharper-vs-c-30-implicitly-typed.html). Voici les règles qu'ils utilisent pour décider quand afficher ce conseil :
Some cases where it seems just fine to suggest var are:
- New object creation expression: var dictionary = new Dictionary<int, string>();
- Cast expression: var element = (IElement)obj;
- Safe Cast expression: var element = obj as IElement;
- Generic method call with explicit type arguments, when return type is generic: var manager = serviceProvider.GetService<IManager>()
- Generic static method call or property with explicit type arguments, when return type is generic: var manager = Singleton<Manager>.Instance;
Les développeurs de Resharper ont donc décidé de suggérer d'utiliser var quasiment à chaque fois que le compilateur peut inférer lui même le type de l'expression. C'est à dire dans 99% des cas. De toute évidence, ils se sont ici trompés, comme le montre les spécifications du langage (http://msdn.microsoft.com/en-us/library/bb383973.aspx) :
Overuse of var can make source code less readable for others. It is recommended to use var only when it is necessary, that is, when the variable will be used to store an anonymous type or a collection of anonymous types.
Le mot clé var est un outil amusant qui permet de gagner quelques secondes en tapant le nom d'un type, mais il ne doit surtout pas être utilisé à ces fins. Si vous le faites, le code va perdre beaucoup en lisibilité, et vous diminuez vos chances de détecter des erreurs à la compilation (par exemple, en changeant le type de retour d'une fonction, vous pouvez changer sans le vouloir le type d'une variable locale typée avec var, et changer la surcharge appelée par la suite dont cette variable est l'argument).
var doit être utilisé uniquement quand vous n'avez pas d'autre choix, c'est à dire dans les cas suivant :
- Le type d'une expression est un type anonyme
var product = new { Id = 25, Price = 32.0 };
- Le type d'une expression est un type générique dont un des paramètres est un type anonyme
var products = from id in ids
select new { Id = id, Price = prices[id] };
Et évitez également d'avoir une confiance aveugle en ce genre d'outils, ils peuvent aussi parfois vous induire en erreur.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :