Je viens de commencer à utiliser ReSharper avec Visual Studio (après les nombreuses recommandations sur SO). Pour l'essayer, j'ai ouvert un récent projet ASP.NET MVC. L'une des premières et des plus fréquentes choses que j'ai remarquées suggérer est de changer la plupart / toutes mes déclarations explicites à la var
place. 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 est-ce recommandé? Je ne suis pas issu de l'informatique ou du domaine .NET, étant récemment tombé dans le développement .NET, j'aimerais vraiment comprendre ce qui se passe et savoir si cela présente des avantages ou non.
var
, même lorsque le type n'est pas évident du tout! la raison est parce qu'il oblige - moi à choisir le nom le plus descriptif que je peux trouver et , finalement , qui rend le code beaucoup, beaucoup plus facile à lire. En fin de compte, cela aide également à séparer la logique de la mise en œuvre. Bien sûr, c'est juste mon opinion, j'espère que cela aiderait quelqu'un;).Réponses:
L'une des raisons est une meilleure lisibilité. Ce qui est mieux?
ou
la source
var
pour tout - je fais beaucoup et revues de code en utilisant TFS (Les diffs basés sur le Web) et il rend mon travail extrêmement difficile: par exemplevar items = GetSomeItems();
vsIDataReader dr = GetSomeItems();
manquantes à l' aide déclaration sur moi à la fois , mais plus facile pour attraper lors de l' utilisationIDataReader
vsvar
.Ce que ReSharper suggère est clairement une surutilisation du mot-clé var. Vous pouvez l'utiliser là où le type est évident:
Si le type n'est pas évident, vous devriez plutôt l'écrire:
la source
var
est une question d'opinion, et non "clairement" une chose ou une autre. Je préfère ne pas taper des choses que le compilateur peut comprendre par lui-même. J'aime l'inférence de type C # et souhaite souvent qu'elle soit aussi bonne que l'inférence de type F #. Si je le pouvais, je laisserais de côté les types explicites des paramètres de méthode et les types de retour, comme c'est la norme en F #. Bien sûr, tout le monde n'est pas d'accord.Stream
objet par exemple est nomméeRead
, nonReadAndReturnNumberOfBytesAsInt32
.Personnellement, je préfère désactiver cette suggestion. L'utilisation
var
peut souvent améliorer la lisibilité; mais comme vous l'avez mentionné, cela le réduit parfois (avec des types simples, ou lorsque le type résultant est obscur ).Je préfère choisir quand j'utilise
var
et quand je ne le fais pas. Mais encore une fois, c'est juste moi.la source
var
assez souvent aussi.var methodXYResultIntArray
. C'est contre toutes les normes de codage et moins concis queint[] methodXYResult
. Si vous souhaitez renvoyer unbyte[]
de la méthode à l'avenir, tous vos noms de variables sont faux. Avec des types explicites, vous pouvez refactoriser cela très facilement. Il y a des raisons d'utiliservar
, par exemple avec unDictionary<string, List<SomeType<int>>>
. Mais si le nom de type complet n'est pas trop long et que vous n'utilisez pasnew
du côté droit (ou une distribution explicite), le resharper ne devrait pas le suggérer.var
peut augmenter la lisibilité du code tout en diminuant la compréhension immédiate du code. De même, cela peut diminuer la lisibilité du code pour d'autres situations. Parfois, son utilisation est neutre. La mesure de la lisibilité à la compréhension n'est pas proportionnelle mais dépend de la situation. Parfois, les deux augmentent ou diminuent ensemble.Le facteur est de savoir à quoi
var
est appliqué et dans quelle mesure la cible prend en charge l'obfuscation immédiate de son type de données au lecteur, ou si ses informations de type sont nécessaires pour comprendre la partie de programme à portée de main.Par exemple, une mauvaise dénomination peut entraîner
var
une diminution de la compréhension du code. Ce n'est cependant pasvar
la faute:Parfois, cela n'a pas de sens d'utiliser
var
des types de données simples lorsque le code est plus lisible en son absence:Parfois, il
var
peut être utile de masquer des informations de type de données dont vous ne vous souciez pas nécessairement de voir les complexités de:Vous devez utiliser
var
quand un type anonyme est présent car il n'y a pas de nom de type pour l'appeler par:Malgré que Visual Studio Intellisense fournisse des informations de type malgré
var
, vous devez alors vous fier moins à votre compréhension via une lecture de code stricte 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 que l'application de la carte blanche
var
n'est pas une bonne idée car la plupart des choses sont à faire avec modération et en fonction des circonstances, comme indiqué ici.Pourquoi Resharper l'utilise-t-il partout par défaut? Je suggérerais pour plus de facilité, car il ne peut pas analyser les nuances des situations pour décider du meilleur moment pour ne pas l'utiliser.
la source
var
, cela vous obligera à écrire des noms de méthode décents.GetNumber() -but what type?
- eh bien, pourquoi vous en souciez-vous? Si c'est si important de savoir, appelez la méthodeGetNumberAsDouble()
, alors c'est aussi clair et cela fonctionnera si vous avez une méthode qui revientstring
et une qui revientdouble
.Dans ReSharper (8.02, mais probablement dans d'autres versions), l'option pour la suggestion "Utiliser la déclaration de variable locale implicitement typée" peut être ajustée selon vos préférences , quelle qu'elle soit, en ouvrant d'abord le menu d'options pour ReSharper:
Ensuite, sous "Code Inspection" en ajustant la "gravité de l'inspection" de la langue que vous avez choisie, dans mon cas c #:
Comme vous pouvez le voir, il existe des options pour ajuster toutes les suggestions de ReSharper. J'espère que cela aide quelqu'un comme moi qui a déjà une stratégie d'utilisation 'var' et veut juste que ReSharper la respecte :)
la source
Je suis surpris que personne n'ait mentionné qu'il est également plus facile de changer le type de l'objet instancié, car
est une forme de répétition . Si je veux changer
AVeryLongTypeName
dans l'une de ses classes dérivées, je n'ai besoin de changer cela qu'une seule fois lors de l'utilisationvar
et je peux toujours accéder aux méthodes des classes enfants.En dehors de cela, la lisibilité améliorée est un point important, mais comme d'autres l'ont dit, var ne devrait pas être surutilisé, donc je pense que désactiver l'indication dans Resharper est absolument correct.
la source
'var' signifie être clair
Le principal débat sur l'utilisation
var
ou non du mot - clé concerne la lisibilité du code pour vous et les autres développeurs.Tout comme si vous écriviez une histoire, il n'y a pas de bonne réponse définitive. Mais regardons quelques exemples de cela en anglais simple.
Qui est allé dans l'autre sens? Jake ou Bill? Dans ce cas, utiliser les noms "Jake" et "Bill" revient à utiliser le nom du type. Et «il» et «lui», c'est comme utiliser le
var
mot - clé. Dans ce cas, il peut être utile d'être plus précis. Par exemple, ce qui suit est beaucoup plus clair.Dans ce cas, être plus précis a rendu la phrase plus claire. Mais ce ne sera pas toujours le cas. Dans certains cas, être spécifique rend la lecture plus difficile.
Dans ce cas, il serait plus facile de lire la phrase si nous utilisons "il" et dans certains cas, omettons son nom tous ensemble, ce qui équivaut à utiliser le
var
mot - clé.Ces exemples couvrent l'essentiel, mais ils ne racontent pas toute l'histoire. Dans ces exemples, il n'y avait qu'une seule façon de se référer à la personne. Soit en utilisant leur nom, soit en utilisant un terme plus général comme «il» et «lui».
Dans le cas du code, nous avons 3 façons d'aider à ajouter de la clarté. Le type, le nom de la variable et l'affectation. Prenez cette ligne de code par exemple:
La question devient maintenant: y a-t-il suffisamment d'informations dans cette ligne de code pour vous aider à comprendre ce qui se passe?
Qu'en est-il de la ligne de code suivante? Souhaitez-vous encore savoir ce que
p
signifie dans ce cas:Et maintenant:
Ou maintenant:
Ou celui-ci:
Ou ca:
Le fonctionnement du mot clé
var
dans un scénario donné dépend en grande partie du contexte du code, comme la façon dont les variables, les classes et les méthodes sont nommées. Cela dépend également de la complexité du code et du reste du code qui l'entoure.Personnellement, j'aime utiliser le
var
mot - clé qui est le plus complet pour moi la plupart du temps. Mais j'ai aussi tendance à nommer mes variables après le type, donc je ne perds vraiment aucune information.Cela dit, parfois, selon le contexte, je fais des exceptions, telle est la nature de tout ce qui est complexe, et le logiciel n'est rien sinon complexe.
la source
var
tant que je sais ce que c'est en lisant cette seule ligne. Si je n'ai aucune idée de ce qu'une méthode d'une autre solution utilisant un modèle de domaine différent renvoie, je préfère que ce type soit défini explicitement, ce qui le rend beaucoup plus facile à lire. +1Je n'aimais pas cela non plus.
Je ne veux pas que cela se transforme en débat sur l'utilisation de
var
, il a ses utilisations mais ne devrait pas être utilisé partout.La chose clé à retenir est que ReSharper est configuré selon les normes de codage que vous souhaitez.
Edit: ReSharper et var
la source
Je vois beaucoup de bonnes réponses, mais je manque la réponse complète.
Il est vrai que ReSharper sur-utilise
var
par défaut. Je pense que la plupart des gens seraient d'accord avec cela. Il est également plus facile de lire quandvar
est utilisé et le type est évident, comme lorsque vous utilisez unenew
instruction. J'ai vu un article qui montrait comment mettre à jour la gravité de l'inspection pour n'afficher que des conseils d'utilisationvar
.J'avais d'abord essayé de commenter d'autres articles pour ajouter où les placer, mais je n'avais pas la réputation pour cela. Apparemment, je n'avais pas non plus la réputation de publier ma capture d'écran des paramètres.
Je vais vous expliquer comment y arriver.
Dans Visual Studio> Menu principal> Resharper> Options> Édition de code> C #> Style de code> Var utilisation dans les déclarations
Documentation d'aide ReSharper: Style de syntaxe de code: Typage implicite / explicite (mot-clé 'var') - Configurer les préférences d'utilisation du mot-clé 'var'
la source
Ma règle est la suivante:
Est -ce que vous déclarez un type primitif (c. -à
byte
,char
,string
,int[]
,double?
,decimal
, etc.)? -> Utilisez le type:Déclarez-vous un type complexe (c.
List<T>
-à- d .Dictionary<T, T>
,MyObj
)? -> Utilisationvar
:la source
string myStr = "foo";
c'est évident que c'est une chaîne. Je mettrais tous vos exemples dans l'utilisation de la catégorie var ... et les déclarations qui sont des retours d'une méthode pour utiliser le type explicité. Mais à la fin de la journée, c'est tout ce que vous et votre équipe pensez être le mieux pour le projet particulier.Je voudrais juste souligner que l'utilisation de "var" est recommandée dans les conventions de codage C #
c'est probablement la raison pour laquelle l'astuce est activée par défaut dans ReSharper. Ils fournissent également certains cas où cela n'améliorerait pas la lisibilité juste en dessous dans le même document.
la source
System.Diagnostics.PerformanceCounter()
- Vous pouvez facilement dire son compteur de performances à partir de la classe de diagnostic intégrée. Mais quel type est retourné ici?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)
? Aucun indice de synchronisation, surtout si vous avez bien plus de 100 projets dans votre solution.ReSharper recommande
var
car il a tendance à désencombrer la création d'objets.Comparez ces deux exemples:
C'est juste un raccourci qui est censé être plus facile à lire.
Je pense que c'est bien quand vous créez explicitement de nouveaux objets avec "nouveau". Dans votre exemple cependant, il peut ne pas être évident si les classes n'ont pas été nommées correctement.
la source
BTW, ReSharper fait une distinction entre «vous voudrez peut-être appliquer cette suggestion à votre code» et «votre code est cassé, voulez-vous que je le répare?». Le
var
mot-clé se trouve dans la catégorie de suggestion, avec des éléments comme "inverser si pour réduire l'imbrication"; vous n'êtes pas obligé de le suivre.Vous pouvez configurer la gêne de chacune de ses alertes via la boîte de dialogue Options ou directement via le menu contextuel de cette alerte. Vous pouvez rétrograder des choses comme la
var
suggestion afin qu'elles soient moins importantes, ou vous pouvez mettre à niveau des choses comme l'alerte `` utiliser la méthode d'extension '' pour qu'elle apparaisse comme une erreur réelle.la source
La
var
fonctionnalité de .Net 3.0 est juste une inférence de type , qui est sûre de type et rend souvent votre code plus facile à lire. Mais vous n'êtes pas obligé de le faire et pouvez désactiver cette recommandation dans Resharper si vous le souhaitez.la source
Le Var est incroyable! J'ai rencontré beaucoup de développeurs qui ont l'impression d'
var
être liés à un type dynamique, ce n'est pas le cas. Il est toujours typé statiquement, c'est juste décidé par le compilateur.Voici quelques avantages étonnants de l'utilisation de var
Moins de var est plus court et plus facile à lire, par exemple
Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()
Yuk.var postcodes = new Dictionary<int,IList<string>>()
\ o / \ o /Noms de variables plus descriptifs - ténus mais je pense qu'il est important de laisser
var
briller ici la nature fluide de la variable . Commevar
c'est un peu vague, cela encourage vraiment un nom de variable plus descriptif plutôt que de laisser le type parler de lui-même.Moins de changements de code - si le type de retour d'un appel de méthode change. Vous n'avez qu'à changer l'appel de méthode, pas tous les endroits où il est utilisé.
Types anonymes - les types anonymes sont un concept vraiment puissant, en particulier dans des domaines tels que les ressources partielles WebApi . Sans var, ils ne peuvent pas être utilisés.
Parfois, cependant, il est utile de déclarer explicitement des types et je trouve cela très utile dans les primitives ou les structures. Par exemple, je ne trouve pas personnellement cette syntaxe très utile:
contre
Tout
var
dépend des préférences personnelles, mais l'utilisation accélérera vraiment votre développement et débloquera tout un monde de bonté de type anonyme.la source
Il n'y a pas de différence technique, si vous utilisez var, le type est impliqué par le compilateur. Si vous avez un code comme celui-ci:
x est implicitement un entier et aucune autre valeur ne peut lui être affectée.
Le mot clé var est utile si vous changez le type de la variable; il vous suffit alors de faire un changement au lieu de deux:
la source
Le
var
mot clé a été introduit dans C # 3.0 - il nous permet d'oublier de spécifier explicitement notre type.Il n'y a pas de réelle différence si vous utilisez
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
ou
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
sauf lisibilité pure et moins de risque d'erreur.
Cela semble être un exemple cliché, mais dites que ce qui suit peut vous aider à comprendre:
renvoie un
int
type, alors querenvoie un
string
type.Référence MSDN
la source
La spécification d'un type d'objet explicite est en quelque sorte redondante. Même traduit en anglais, cela semble redondant: "mettre un objet de type X dans une variable de type X" vs "Mettre un objet de type X dans une variable".
Cependant, l'utilisation de «var» a ses limites . Il empêche l'utilisation ci-dessous du polymorphisme qui est pure beauté :
Supposons qu'un chien étend un animal; Cat étend la hiérarchie des classes animales:
Le même code, avec x déclaré avec 'var' ne sera pas compilé .
Quoi qu'il en soit, revenons à la question d'origine, je n'utilise pas Resharper, mais je suppose que c'est assez intelligent pour détecter quand ne pas utiliser 'var'. :-)
la source
as
) est vraiment affreux. Vous transformez les erreurs de compilation en erreurs d'exécution si vous avez quelque chose commeAnimal x = new Cat(); DoStuffWithDog(x as Dog);
Pourquoi réutiliser x? Chien x = nouveau chien (), chat y = nouveau chat (), boom plus d'ambiguïté possible.Animal
dans des méthodes qui prennentDog
etCat
. Polymorphisme est l'inverse: pour que vous puissiez passer des objets de typeDog
etCat
dans une méthode qui prendAnimal
, par exemplevoid Walk(Animal a)
:Walk(new Cat())
,Walk(new Dog())
À mon avis,
var
ne devrait être utilisé que lorsqu'il est immédiatement clair quel est le type lors de la définition de la valeur de la variable.Exemple:
Il est évident que
s
c'est unstring
.Je pense qu'il est également approprié lorsque le nom du type de variable est très complexe.
Exemple:
À part ces scénarios, je ne vois aucun gain à faire en utilisant
var
, mais je peux penser à certains scénarios dans lesquels cela peut être préjudiciable:Par exemple, un type jetable dont la valeur de la variable de droite n'affiche pas clairement le type. L'élimination de l'IDisposable peut facilement être oubliée
Exemple:
la source
'var' ajoute une sorte d'élément "dynamique" à votre code (bien que le code reste bien sûr strictement typé). Je déconseille de l'utiliser dans les cas où le type n'est pas clair. Considérez cet exemple:
Si le type de retour de GetTheObjectFromDatabase () passe du type A au type B, nous ne le remarquerons pas, car les deux classes implémentent DoSomething (). Cependant, le code peut maintenant faire quelque chose de complètement différent.
Cela peut être aussi subtil que d'écrire des choses différentes dans un journal, donc vous ne remarquerez peut-être pas qu'il est trop tard.
L'utilisation suivante de var devrait toujours convenir:
la source
Pour ceux qui n'aiment pas l'utilisation constante de "var", vous pouvez également empêcher ReSharper de passer par défaut à var lors de l'introduction de "variable". C'est quelque chose qui m'a frustré pendant longtemps, il était toujours par défaut var et je le changeais à chaque fois.
Ces paramètres sont sous Édition de code> C #> Style de code
la source
Il n'y a pas de différence technique (comme l'a souligné eWolf). Vous pouvez utiliser l'un ou l'autre, le code CLR généré sera identique.
À mon avis, le principal avantage est que cela vous oblige à utiliser une meilleure dénomination des variables. Dans votre exemple, 'foo' est un assez mauvais choix pour un nom de variable.
la source
Selon JetBrains (l'auteur de ReSharper), ils encouragent l'utilisation de var par défaut.
Depuis leur site Web :
la source