Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

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:

  1. New object creation expression: var dictionary = new Dictionary<int, string>();
  2. Cast expression: var element = (IElement)obj;
  3. Safe Cast expression: var element = obj as IElement;
  4. Generic method call with explicit type arguments, when return type is generic: var manager = serviceProvider.GetService<IManager>()
  5. 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.

Publié vendredi 11 juillet 2008 10:59 par RaptorXP
Classé sous : , ,
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 :

Commentaires

# re: C# 3.0 Best Practices : Utilisation de var

Entierement d'accord, après quelques mois d'utilisation de C#3 j'utilise le mot clé var que pour les requetes linq et type anonyme.

Idem pour les propriétés automatique que je n'apprécie pas du tout ...

vendredi 11 juillet 2008 12:57 by cyril

# re: C# 3.0 Best Practices : Utilisation de var

C'est effectivement ce que l'on peut appeler une belle c**** de la part des équipes Resharper ; et - surtout - d'avoir placé cette règle de remplacement automatique par défaut.

Il s'agit cependant d'une règle de refactoring : on peut donc la désactiver!

Encore mieux, la règle peut être inversée : on peut demander à Resharper de nous signaler tous les "var" inutiles, et les remplacer par le bon type.

Au fond l'erreur de l'équipe est d'avoir placée la mauvaise règle par défaut.

vendredi 11 juillet 2008 16:26 by Chubyone

# re: C# 3.0 Best Practices : Utilisation de var

Il faut garder à l'esprit la première loi du developpeur, ce que la machine peut faire a sa place il faut lui laisser faire.

Il ne s'agit que d'une declaration de variable locale. Effectivement ça peut devenir illisible quand une methode depasse les 100 lignes de code, c'est plutot ça qu'il faut eviter.

AMHA, la declaration "var" est une belle evolution du language c# 3.0, en aucune manière on ne peut se tromper sur le type de retour d'une methode, il ne faut surtout pas confondre

var param = ...

et

object param = ...

ça n'a rien a voir.

vendredi 11 juillet 2008 21:57 by mchouteau

# re: C# 3.0 Best Practices : Utilisation de var

"il ne faut surtout pas confondre var et object"

Ce que j'expliquais plus haut, c'est que si tu as 2 méthodes :

void Process(ClassA arg){ .... }

et

void Process(ClassB arg){ .... }

et une autre méthode :

ClassA Create() { ... }

et que quelque part, tu as

var inst = Create();

Process(inst);

Si tu changes le type de retour de Create en ClassB, le comportement de ton programme va changer sans même que tu t'en rende compte. Mais c'est vrai que ce cas se produit rarement.

Mais d'une manière générale, plus le code a de contraintes, plus tu as de contrôle sur ce qu'il fait.

vendredi 11 juillet 2008 23:35 by RaptorXP

# re: C# 3.0 Best Practices : Utilisation de var

En VB.NET on a plus de chance car "Dim O = XYZ" existait déjà avant mais était similaire à "Dim O as Object = XYZ" et était donc largement évité à moins de travailler sur du COM, et encore.

Même depuis que cela a disparu et que c'est maintenant la même chose que "var", personne n'a vraiment envie de l'utiliser lorsque cela n'est pas nécessaire (du moins c'est vrai pour moi en tout cas).

N'empêche que j'ai toujours préféré "Dim VarName as TypeName = XYZ" à "TypeName VarName = XYZ", et je suis content de pouvoir le faire en C# aussi ("var o = new TypeName()" ou "var o = XZY as TypeName")

samedi 12 juillet 2008 14:22 by FREMYCOMPANY

# re: C# 3.0 Best Practices : Utilisation de var

intéressant ce billet car justement, ayant installé ReSharper 4 il y a 15jours, c'est LE point qui m'avait choqué.

tout est plus clair maintenant :)

jeudi 17 juillet 2008 10:32 by lgmorand

# re: C# 3.0 Best Practices : Utilisation de var

A rebousse poil de ce qui a été dit, Resharper n'est pas surprenant sur ce point, il ne fait que proposer une construction syntaxique parfaitement légale et moins verbeuse que l'écriture originale du code.

Il faut ainsi savoir se servir de Resharper, comme tout outil de ce type, et c'est au développeur de décider de l'à propos d'une suggestion ! Resharper n'est donc pas à blamer, si quelqu'un doit l'être, c'est le développeur qui prend pour obligation ce qui n'est que suggestion...

Cela dit, sur le fond du billet, je suis d'accord avec le fait que l'utilisation massive de "var" peut rendre le code moins évident à lire puisque nous avons l'habitude de voir le type avant la déclaration et qu'avec "var" il faut lire toute la ligne pour "inférer" de tête le type utilisé (parfois cela est simple, un "new" par exemple, parfois il faut aller chercher l'info très loin si c'est juste un retour d'appel à une méthode...).

"var" étant une simplification, il faut lui aussi l'utiliser à juste propos, sans fanatisme "pro" ou "contre".

Toujours pareil, aucun langage, aucun outil de développement ne permet à l'informaticien de faire l'économie d'une preuve d'intelligence...

dimanche 27 juillet 2008 21:32 by Merlin
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01