233 votes

Pourquoi ReSharper veut-il utiliser 'var' pour tout ?

Je viens de commencer à utiliser ReSharper avec Visual Studio (après les nombreuses recommandations sur SO). Pour l'essayer, j'ai ouvert un projet ASP.NET MVC récent. L'une des premières et plus fréquentes choses que j'ai remarquées, c'est qu'il suggère de changer la plupart/toutes mes déclarations explicites en var au lieu de cela. Par exemple :

//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);

et ainsi de suite, même avec des types simples tels que int , bool , etc.

Pourquoi cette recommandation ? Je n'ai pas de formation en informatique ou en .NET, je suis "tombé" dans le développement .NET récemment, donc j'aimerais vraiment comprendre ce qui se passe et savoir si c'est utile ou non.

6 votes

30 votes

J'y ai réfléchi pendant un certain temps et j'en suis arrivé à la conclusion que je devrais toujours utiliser var même lorsque le type n'est pas du tout évident ! la raison en est qu'il fuerzas de choisir le nom le plus descriptif possible, ce qui rend le code beaucoup plus lisible. En fin de compte, cela permet également de séparer la logique de l'implémentation. Bien sûr, ce n'est que mon opinion, j'espère que cela aidera quelqu'un ;).

298voto

Guffa Points 308133

Ce que ReSharper suggère est clairement une utilisation excessive du mot-clé var. Vous pouvez l'utiliser lorsque le type est évident :

var obj = new SomeObject();

Si le type n'est pas évident, il est préférable de l'écrire :

SomeObject obj = DB.SomeClass.GetObject(42);

41 votes

Pour se faire l'avocat du diable, peut-être que si le type n'est pas clair dans la méthode ou le nom de la variable, cela indique un problème de dénomination plus qu'une utilisation excessive de var. Je suis d'accord en principe, var ne devrait être utilisé que lorsqu'il ne nuit pas à la clarté.

37 votes

Dans ce cas, je préférerais utiliser de meilleurs noms de variables. Vous proposez essentiellement que nous regardions où la variable est définie pour en déterminer le type - je propose que nous nommions mieux les variables afin d'en connaître d'emblée l'objectif.

20 votes

@Jaco : +1, mais il vaut la peine de mentionner que l'information sur le type n'est pas recommandée dans le nom d'une variable. Par exemple, la notation hongroise n'est pas considérée comme une bonne pratique.

204voto

Mark Sherretta Points 5272

L'une des raisons est l'amélioration de la lisibilité. Qu'est-ce qui est mieux ?

Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();

ou

var dictionary = new Dictionary<int, MyLongNamedObject>();

282 votes

Je dirais le premier. Il est plus facile de voir ce qui se passe !

126 votes

Champignons : Vous aimez Vous aimez Texte redondant Texte redondant ? :D

4 votes

Merci. Le consensus semble indiquer qu'il s'agit simplement d'une suggestion de lisibilité, plutôt que d'un avantage au moment de la compilation.

101voto

Bryan Menard Points 5664

Personnellement, je préfère désactiver cette suggestion. L'utilisation de var peut souvent améliorer la lisibilité ; mais comme vous l'avez mentionné, elle la réduit parfois (avec des types simples, ou lorsque le type résultant est obscure ).

Je préfère choisir quand j'utilise var et quand je ne le fais pas. Mais encore une fois, cela ne concerne que moi.

11 votes

Je pensais que ReSharper était censé être assez intelligent ; ne devrait-il pas être assez intelligent pour savoir quand le type résultant est évident (par exemple, tout ce qui contient le mot-clé new) et quand il ne l'est pas ?

3 votes

Je ne connais pas les particularités de cette fonction, mais je sais que j'ai été submergé par le nombre de suggestions qu'elle m'a données. var assez souvent aussi.

7 votes

J'ai découvert que lorsque vous utilisez toujours var (comme le suggère resharper), il vous force à nommer vos variables correctement.

70voto

John K Points 13695

var peut augmenter la lisibilité du code tout en diminuant la compréhension immédiate du code. De même, elle peut diminuer la lisibilité du code dans d'autres situations. Parfois, son utilisation est neutre. La mesure de la lisibilité par rapport à la compréhension n'est pas proportionnelle mais dépend de la situation. Parfois, les deux sont augmentés ou diminués en même temps.

Le facteur est ce qui var et dans quelle mesure la cible supporte l'obscurcissement immédiat de son type de données pour le lecteur, ou si l'information sur son type est nécessaire pour comprendre la partie du programme en question.

Par exemple, une mauvaise dénomination peut conduire à var entraînant une diminution de la compréhension du code. Ce n'est pas var Mais c'est la faute de l'homme :

var value1 = GetNotObviousValue(); //What's the data type? 
//vs. 
var value2 = Math.Abs(-3); // Obviously a numeric data type. 

Parfois, il n'est pas judicieux d'utiliser var pour les types de données simples lorsque le code est plus lisible en son absence :

var num = GetNumber(); // But what type of number?
// vs. 
double num = GetNumber(); // I see, it's a double type. 

Parfois var peut être utile pour cacher des informations sur les types de données dont on ne veut pas nécessairement voir la complexité :

    IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG! 
    //vs. 
    var q = from t in d where t.Key == null select t;

    // I simply want the first string, so the last version seems fine.  
    q.First().Key; 

Vous doit utiliser var lorsqu'un type anonyme est présent car il n'y a pas de nom de type pour l'appeler :

var o = new { Num=3, Name="" };

Lorsque l'Intellisense de Visual Studio fournit des informations sur les types en dépit de la présence de var Vous devez alors moins vous fier à votre compréhension en lisant le code sans aide. Il est probablement sage de supposer que tout le monde n'a pas ou n'utilise pas Intellisense.

En résumé, sur la base des exemples ci-dessus, Je suggérerais l'application carte blanche de var n'est pas une bonne idée, car la plupart des choses doivent être faites avec modération et en fonction des circonstances, comme le montre l'exemple suivant.

Pourquoi Resharper l'utilise-t-il toujours par défaut ? Je dirais que c'est par facilité, parce qu'il ne peut pas analyser les nuances des situations pour décider quand il vaut mieux ne pas l'utiliser.

5 votes

IMHO vos exemples sont en fait de bonnes raisons d'utiliser var Cela vous obligera à écrire des noms de méthodes décents. GetNumber() -but what type? - bien, pourquoi vous en préoccuper ? S'il est si important de le savoir, appelez la méthode GetNumberAsDouble() Le texte est alors tout aussi clair et fonctionnera si vous avez une seule méthode de retour. string et un autre qui revient double .

10 votes

@nicodemus13 On sait généralement que l'on s'intéresse au type de retour d'une fonction lorsqu'on le fait. utiliser la valeur de retour plutôt que lorsque vous écrivez la fonction elle-même. Le schéma de dénomination que vous proposez pourrait conduire à des abus tels que GetResultsAsIEnumerableOfDouble et tout ce qu'il fait, c'est déplacer l'information de type que vous avez retirée du côté gauche d'une affectation en utilisant var vers le côté droit de l'affectation.

0 votes

Var value2 = Math.Abs(-3) ; // Il s'agit manifestement d'un type de données numériques. Désolé, je ne suis pas du tout d'accord sur ce point, étant donné que la méthode Abs a 7 surcharges qui ne mènent à rien d'autre qu'à l'obscurité, imo

18voto

LiamB Points 7105

Je n'ai pas aimé cela non plus.

Je ne veux pas que cela se transforme en un débat sur l'utilisation des var Il a son utilité, mais ne devrait pas être utilisé partout.

Ce qu'il faut retenir, c'est que ReSharper est configuré selon les normes de codage que vous souhaitez.

Edita: ReSharper et var

15 votes

Après avoir résisté pendant un an environ, j'utilise presque toujours var maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X