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.
la source
var i = 0;
== échouer!var c = new CrazyFrigginLongClassName();
== gagner!var readabilityBeDamned = true;
Réponses:
Je pense toujours que le
var
code peut être plus lisible dans certains cas. Si j'ai une classe Customer avec une propriété Orders et que je veux l'attribuer à une variable, je vais simplement faire ceci:Peu m'importe si Customer.Orders l'est
IEnumerable<Order>
,ObservableCollection<Order>
ouBindingList<Order>
- tout ce que je veux, c'est garder cette liste en mémoire pour l'itérer ou obtenir son nombre ou quelque chose plus tard.Comparez la déclaration ci-dessus avec:
Pour moi, le nom du type est juste du bruit. Et si je reviens en arrière et que je décide de changer le type de client, je descends la piste (disons de
ObservableCollection<Order>
àIList<Order>
) alors je dois aussi changer cette déclaration - quelque chose que je n'aurais pas à faire si j'avais utilisé var dans le premier endroit.la source
J'utilise
var
beaucoup. Il a été critiqué que cela diminue la lisibilité du code, mais aucun argument pour soutenir cette affirmation.Certes, cela peut signifier que le type auquel nous avons affaire n'est pas clair. Et alors? C'est en fait le point d'une conception découplée. Lorsque vous traitez avec des interfaces, vous n'êtes absolument pas intéressé par le type d'une variable.
var
prend ce beaucoup plus loin, vrai, mais je pense que l'argument reste le même d'un point de vue de la lisibilité: Le programmeur ne devrait pas vraiment être intéressé par le type de la variable mais plutôt ce qu'est une variable fait . C'est pourquoi Microsoft appelle également l'inférence de type «typage de canard».Alors, que fait une variable lorsque je la déclare en utilisant
var
? Facile, il fait tout ce qu'IntelliSense me dit de faire. Tout raisonnement sur C # qui ignore l'IDE est loin de la réalité. En pratique, chaque code C # est programmé dans un IDE qui prend en charge IntelliSense.Si j'utilise une
var
variable déclarée et que je ne sais pas à quoi sert la variable, il y a quelque chose de fondamentalement mauvais avec mon code.var
n'est pas la cause, elle rend seulement les symptômes visibles. Ne blâmez pas le messager.Maintenant, l'équipe C # a publié une directive indiquant que le codage
var
doit seulement être utilisé pour capturer le résultat d'une déclaration de LINQ qui crée un type anonyme (car ici, nous avons pas d' alternative réelle àvar
). Eh bien, vissez ça. Tant que l'équipe C # ne me donnera pas d'argument valable pour cette directive, je vais l'ignorer parce qu'à mon avis professionnel et personnel, c'est du pur baloney. (Désolé; je n'ai aucun lien vers la ligne directrice en question.)En fait, il y a (superficiellement) de bonnes explications sur les raisons pour lesquelles vous ne devriez pas utiliser,
var
mais je pense toujours qu'elles sont largement fausses. Prenons l'exemple de la «possibilité de recherche»: l'auteur affirme qu'ilvar
est difficile de rechercher des endroits où ilMyType
est utilisé. Droite. Les interfaces aussi. En fait, pourquoi voudrais-je savoir où la classe est utilisée? Je serais peut-être plus intéressé par l'endroit où il est instancié et cela sera toujours consultable car quelque part son constructeur doit être invoqué (même si cela se fait indirectement, le nom du type doit être mentionné quelque part).la source
var
contribue à la confusion. Certes, il peut y avoir des cas où il est important de souligner le type / la taille d'une variable (par exemple les opérations sur les bits de bas niveau). C'est bien: personne n'a jamais prétendu que celavar
devrait être utilisé exclusivement. La règle est simple: si cela crée vraiment de la confusion, ne l'utilisez pas.Var, à mon avis, en C # est une bonne chose tm . Toute variable ainsi typée est toujours fortement typée, mais elle obtient son type du côté droit de l'affectation où elle est définie. Étant donné que les informations de type sont disponibles sur le côté droit, dans la plupart des cas, il est inutile et trop verbeux de devoir également les saisir sur le côté gauche. Je pense que cela augmente considérablement la lisibilité sans diminuer la sécurité du type.
De mon point de vue, l'utilisation de bonnes conventions de dénomination pour les variables et les méthodes est plus importante du point de vue de la lisibilité que les informations de type explicites. Si j'ai besoin des informations de type, je peux toujours survoler la variable (en VS) et l'obtenir. En règle générale, cependant, les informations de type explicites ne devraient pas être nécessaires au lecteur. Pour le développeur, dans VS, vous obtenez toujours Intellisense, quelle que soit la façon dont la variable est déclarée. Cela dit, il peut toujours y avoir des cas où il est logique de déclarer explicitement le type - peut-être avez-vous une méthode qui renvoie un
List<T>
, mais vous voulez le traiter comme unIEnumerable<T>
dans votre méthode. Pour vous assurer que vous utilisez l'interface, la déclaration de la variable du type d'interface peut rendre cela explicite. Ou, peut-être, vous voulez déclarer une variable sans valeur initiale - car elle obtient immédiatement une valeur basée sur une condition. Dans ce cas, vous avez besoin du type. Si les informations de type sont utiles ou nécessaires, allez-y et utilisez-les. Je pense, cependant, que ce n'est généralement pas nécessaire et que le code est plus facile à lire sans lui dans la plupart des cas.la source
Aucun de ces éléments n'est absolument vrai;
var
peut avoir des effets à la fois positifs et négatifs sur la lisibilité. À mon avis,var
doit être utilisé lorsque l'une des conditions suivantes est vraie:var foo = new TypeWithAReallyLongNameTheresNoSenseRepeating()
)var
n'a pas d'impact sur les performances, car c'est du sucre syntaxique; le compilateur déduit le type et le définit une fois qu'il est compilé en IL; il n'y a rien de vraiment dynamique à ce sujet.la source
typedef
quand il ne l'est pas.var
lorsque le type est évident? Peut-être, mais le vrai gain est lorsque le type n'a pas d'importance. Si vous faites des choses commevar customers = whatever; var query = from c in customers select stuff
ça, peu importe le type exact de «clients». Il est évident que vous pouvez l'utiliser, et cela suffit. Et si le type réel est encombrant, cela vaut la peine de le supprimer.using ShortType = LongGenericType<A,B,C>
directive en haut d'un fichier, car cela donne la même lisibilité, ne nécessite pas que vous recréiez les constructeurs et n'élimine pas les classes enfants d'être des candidats.De Eric Lippert, ingénieur principal en conception de logiciels dans l'équipe C #:
Pourquoi le
var
mot - clé a- t-il été introduit?Je souligne. L'article entier, C # 3.0 est toujours typé statiquement, honnêtement! , et les séries suivantes sont plutôt bonnes.
C'est pour ça
var
. D'autres utilisations ne fonctionneront probablement pas aussi bien. Toute comparaison avec JScript, VBScript ou le typage dynamique est totale. Notez à nouveau,var
est nécessaire pour que certaines autres fonctionnalités fonctionnent dans .NET.la source
Je pense que l'utilisation de var doit être associée à des noms de variables judicieusement choisis.
Je n'ai aucun problème à utiliser var dans une instruction foreach, à condition que ce ne soit pas comme ceci:
Si c'était plus comme ça:
... alors quelqu'un lisant le code serait beaucoup plus susceptible de comprendre ce qu'est une "liste". Si vous contrôlez le nom de la variable de liste elle-même, c'est encore mieux.
La même chose peut s'appliquer à d'autres situations. C'est assez inutile:
... mais cela a du sens:
Chacun à sa façon, je suppose. Je me suis retrouvé à faire cela, ce qui est juste fou:
J'ai besoin d'une sorte de programme var en 12 étapes. Je m'appelle Matt et j'utilise (ab) var.
la source
Nous avons adopté l'ethos "Code pour les personnes, pas pour les machines", basé sur l'hypothèse que vous passez plusieurs fois plus longtemps en mode maintenance que sur les nouveaux développements.
Pour moi, cela exclut l'argument selon lequel le compilateur "sait" de quel type est la variable - bien sûr, vous ne pouvez pas écrire de code non valide la première fois car le compilateur arrête la compilation de votre code, mais lorsque le développeur suivant lit le code en 6 mois, ils doivent être capables de déduire ce que fait la variable correctement ou incorrectement et d'identifier rapidement la cause des problèmes.
Donc,
est interdit par nos normes de codage, mais ce qui suit est encouragé dans notre équipe car il augmente la lisibilité:
la source
Ce n'est pas mal, c'est plus une chose stylistique, qui a tendance à être subjective. Il peut ajouter des incohérences, lorsque vous utilisez var et quand vous ne l'utilisez pas.
Un autre cas de préoccupation, dans l'appel suivant, vous ne pouvez pas dire simplement en regardant le code du type retourné par
CallMe
:C'est ma principale plainte contre var.
J'utilise var lorsque je déclare des délégués anonymes dans les méthodes, en quelque sorte var semble plus propre que si je l'utilisais
Func
. Considérez ce code:EDIT : mise à jour du dernier exemple de code basé sur l'entrée de Julian
la source
variable
est créée? Sauf si vous développez votre exemple, ce n'est pas une plainte très solide, OMI.variable
,CallMe
) sont de mauvais exemples. Cependant, siCallMe()
c'était une fonction dans une sorte d '"application téléphonique", celavar call = CallMe(); .... call.HangUp();
aurait beaucoup plus de sens.Var n'est pas du tout comme variante. La variable est toujours fortement typée, c'est juste que vous n'appuyez pas sur les touches pour l'obtenir de cette façon. Vous pouvez survoler dans Visual Studio pour voir le type. Si vous lisez du code imprimé, il est possible que vous deviez réfléchir un peu pour déterminer le type. Mais il n'y a qu'une seule ligne qui le déclare et beaucoup de lignes qui l'utilisent, donc donner des noms décents est toujours le meilleur moyen de rendre votre code plus facile à suivre.
L'utilisation d'Intellisense est-elle paresseuse? C'est moins en tapant que le nom entier. Ou y a-t-il des choses qui demandent moins de travail mais ne méritent pas d'être critiquées? Je pense qu'il y en a, et var en fait partie.
la source
var
n'a rien à voir avecVariant
.Le temps le plus probable dont vous aurez besoin est pour les types anonymes (où il est requis à 100%); mais cela évite également la répétition pour les cas triviaux, et l'OMI rend la ligne plus claire. Je n'ai pas besoin de voir le type deux fois pour une simple initialisation.
Par exemple:
(veuillez ne pas modifier le hscroll ci-dessus - cela prouve un peu le point !!!)
contre:
Il y a cependant des occasions où cela est trompeur et peut potentiellement causer des bugs. Soyez prudent
var
si la variable d'origine et le type initialisé n'étaient pas identiques. Par exemple:la source
Un cas spécifique où var est difficile: les révisions de code hors ligne, en particulier celles effectuées sur papier.
Vous ne pouvez pas compter sur les survols pour cela.
la source
Je ne vois pas ce qu'est le gros problème ..
Vous avez toujours l'intellisense complet sur «quelque chose», et pour tout cas ambigu, vous avez vos tests unitaires, non? ( le faites vous? )
Ce n'est pas varchar, ce n'est pas sombre et ce n'est certainement pas un typage dynamique ou faible. Il arrête maddnes comme ceci:
et réduire cet encombrement total à:
Nice, pas tout à fait aussi agréable que:
Mais c'est à ça que sert Boo .
la source
v = List<somethinglongtypename>();
n'est pas encore mieux. Il est important de distinguer entre l'introduction d'une nouvelle variable et l'attribution à une variable existante.Si quelqu'un utilise le
var
mot - clé parce qu'il ne veut pas "comprendre le type", c'est définitivement la mauvaise raison. levar
mot-clé ne crée pas de variable avec un type dynamique, le compilateur doit encore connaître le type. Comme la variable a toujours un type spécifique, le type doit également être évident dans le code si possible.Les bonnes raisons d'utiliser le
var
mot-clé sont par exemple:L'écriture du type de données facilite souvent le suivi du code. Il montre quels types de données vous utilisez, afin que vous n'ayez pas à déterminer le type de données en déterminant d'abord ce que fait le code.
la source
Étant donné la puissance d'Intellisense, je ne suis pas sûr que var soit plus difficile à lire que d'avoir des variables membres dans une classe ou des variables locales dans une méthode qui sont définies hors de la zone d'écran visible.
Si vous avez une ligne de code telle que
Est beaucoup plus facile ou plus difficile à lire que:
la source
Je pense que l'élément clé avec VAR est de ne l'utiliser que lorsque cela est approprié, c'est-à-dire lorsque vous faites des choses dans Linq qu'il facilite (et probablement dans d'autres cas).
Si vous avez obtenu un type pour quelque chose dans l'alors vous devriez l' utiliser - ne pas le faire est simple paresse (par opposition à la paresse créative qui est généralement être encouragé - de bons programmeurs travaillent souvent très difficile d'être paresseux et pourrait être considéré comme la source de la chose en premier lieu).
Une interdiction générale est aussi mauvaise que d'abuser de la construction en premier lieu, mais il doit y avoir une norme de codage raisonnable.
L'autre chose à retenir est que ce ne est pas un type VB var en ce qu'elle ne peut pas changer de type - il est une variable fortement typé juste que le type est déduit ( ce qui explique pourquoi il y a des gens qui fait valoir que son pas déraisonnable de l'utiliser dans, disons, un foreach mais je ne suis pas d'accord pour des raisons de lisibilité et de maintenabilité).
Je soupçonne que celui-ci va fonctionner et fonctionner (-:
Murph
la source
Bien sûr,
int
c'est facile, mais lorsque le type de variable estIEnumerable<MyStupidLongNamedGenericClass<int, string>>
, var rend les choses beaucoup plus faciles.la source
int
versusvar
est quelque chose à se chamailler, mais plusieurs types génériques imbriqués fontvar
une aubaine. C'est là que l'utilisation répétée du nom de type détruit vraiment la lisibilité du code.class IntStringEnumerator : IEnumerable<MyStupidLongNamedGenericClass<int, string>>
puis utilisez le nouveau nom. Cela nettoie le code et décrit mieux le type.IntStringEnumerator i = new IntStringEnumerator()
est encore trop de frappe.Volé de la poste sur ce problème à CodingHorror :
Malheureusement, vous et tout le monde vous êtes trompé. Bien que je convienne avec vous que la redondance n'est pas une bonne chose, la meilleure façon de résoudre ce problème aurait été de faire quelque chose comme ceci:
MyObject m = new ();
Ou si vous passez des paramètres:
Personne p = nouveau ("FirstName", "LastName);
Lors de la création d'un nouvel objet, le compilateur déduit le type du côté gauche et non du droit. Cela présente d'autres avantages par rapport à "var", dans la mesure où il pourrait également être utilisé dans les déclarations de champ (il existe également d'autres domaines qui pourraient être utiles, mais je ne vais pas y entrer ici).
En fin de compte, il n'était tout simplement pas destiné à réduire la redondance. Ne vous méprenez pas, "var" est TRÈS important en C # pour les types / projections anonymes, mais l'utilisation ici est tout de même OFF (et je le dis depuis longtemps, très longtemps) car vous obscurcissez le type qui est en train d'être utilisé. Devoir le taper deux fois est trop souvent, mais le déclarer zéro fois est trop peu.
Nicholas Paldino .NET / C # MVP le 20 juin 2008 08:00
Je suppose que si votre principale préoccupation est de devoir taper moins - il n'y a aucun argument qui vous empêchera de l'utiliser.
Si vous ne serez jamais que la personne qui regarde votre code, alors qui s'en soucie? Sinon, dans un cas comme celui-ci:
ça va, mais dans un cas comme celui-ci:
il court-circuite toutes les déductions de type immédiates que mon cerveau pourrait commencer à former à partir de «l'anglais» du code.
Sinon, utilisez votre meilleur jugement et votre «courtoisie» de programmation envers les autres qui pourraient avoir à travailler sur votre projet.
la source
Utiliser
var
au lieu du type explicite rend les refactorisations beaucoup plus faciles (donc je dois contredire les affiches précédentes qui signifiaient que cela ne faisait aucune différence ou que c'était purement du "sucre syntaxique").Vous pouvez modifier le type de retour de vos méthodes sans modifier chaque fichier dans lequel cette méthode est appelée. Imaginer
qui est utilisé comme
Si vous vouliez refactoriser
SomeMethod()
pour retourner unIEnumerable<MySecondClass>
, vous devrez changer la déclaration de variable (également à l'intérieur duforeach
) à chaque endroit où vous avez utilisé la méthode.Si vous écrivez
au lieu de cela, vous n'avez pas à le changer.
la source
@aku: Un exemple est les revues de code. Un autre exemple est la refactorisation de scénarios.
Fondamentalement, je ne veux pas aller à la chasse aux caractères avec ma souris. Il pourrait ne pas être disponible.
la source
C'est une question de goût. Toutes ces histoires sur le type d'une variable disparaissent lorsque vous vous habituez à des langues typées dynamiquement. Autrement dit, si jamais vous commencez à les aimer (je ne sais pas si tout le monde peut le faire, mais je le fais).
C #
var
est plutôt cool en ce qu'il ressemble à une frappe dynamique, mais en fait c'est une frappe statique - le compilateur applique une utilisation correcte.Le type de votre variable n'est pas vraiment important (cela a déjà été dit). Il doit être relativement clair d'après le contexte (ses interactions avec d'autres variables et méthodes) et son nom - ne vous attendez pas à ce que customerList contienne un
int
...J'attends toujours de voir ce que mon patron pense de cette question - j'ai une couverture "allez-y" pour utiliser toutes les nouvelles constructions en 3.5, mais que ferons-nous de la maintenance?
la source
Dans votre comparaison entre
IEnumerable<int>
etIEnumerable<double>
vous n'avez pas à vous inquiéter - si vous passez le mauvais type, votre code ne sera pas compilé de toute façon.Il n'y a aucune inquiétude concernant la sécurité des caractères, car elle
var
n'est pas dynamique. C'est juste la magie du compilateur et tout type d'appels dangereux que vous effectuez sera pris.Var
est absolument nécessaire pour Linq:Maintenant, regardez anonEnumeration dans intellisense et il apparaîtra quelque chose comme
IEnumerable<'a>
Le compilateur C # est assez intelligent - les types anon générés séparément auront le même type généré si leurs propriétés correspondent.
En dehors de cela, tant que vous avez Intellisense, il est judicieux d'utiliser
var
partout où le contexte est clair.la source
IQueriable<T>
avant d'itérer:anonEnumeration.ToList();
IQueryable
ou.ToList()
var anonEnumeration = from post in AllPosts() where post.Date > oldDate let author = GetAuthor( post.AuthorId ) select new { PostName = post.Name, post.Date, AuthorName = author.Name };
ne renvoie pas unIQueriable<T>
?AllPosts()
retourne - le demandeur se réfèreList<T>
donc j'ai supposé cela. Dans ce cas, le résultat estanonEnumeration
de typeIEnumerable<'a>
. Maintenant, siAllPosts()
renvoie à laIQueryable<T>
place, alorsanonEnumeration
deviendraIQueryable<'a>
(notez noni
dans Queryable) - cependant dans ce cas, mon code fonctionne toujours car ilIQueryable<T>
implémenteIEnumerable<T>
. Il y a beaucoup de meilleures questions et réponses sur les distinctions entre elles - ici, mon cas'a
est anonyme etvar
vous permet de l'assigner à une variable typée statiquement.IQueryable<T>
n'est pas une bonne pratique car à chaque itération vous faites une instruction de lecture dans DB. Assurez-vous de bien*.ToList()
IQueryable<T>
les parcourirJe suppose que cela dépend de votre point de vue. Personnellement, je n'ai jamais eu de difficulté à comprendre un morceau de code à cause d'une
var
"mauvaise utilisation", et mes collègues et moi l'utilisons beaucoup partout. (Je conviens qu'Intellisense est une aide énorme à cet égard.) Je m'en réjouis comme moyen d'éliminer la cruauté répétitive.Après tout, si des déclarations comme
étaient vraiment impossibles à gérer, personne n'utiliserait des langages typés dynamiquement.
la source
J'utilise uniquement var quand il est clair de voir quel type est utilisé.
Par exemple, j'utiliserais var dans ce cas, car vous pouvez voir immédiatement que x sera du type "MyClass":
Je n'utiliserais PAS var dans des cas comme celui-ci, car vous devez faire glisser la souris sur le code et regarder l'info-bulle pour voir quel type renvoie MyFunction:
Surtout, je n'utilise jamais var dans les cas où le côté droit n'est même pas une méthode, mais seulement une valeur:
(parce que le compilateur ne peut pas savoir si je veux un octet, un court, un entier ou autre)
la source
var
, alors cevar
n'est pas le problème: le côté droit est le problème. Ce n'est pas assez descriptif .Customer c = GetContext()
n'est toujours pas clair et ne vaut pas mieux que d'utiliservar
.Pour moi, l'antipathie envers
var
illustre pourquoi le bilinguisme dans .NET est important. Pour les programmeurs C # qui ont également fait VB .NET, les avantages devar
sont intuitivement évidents. La déclaration C # standard de:est l'équivalent, dans VB .NET, de taper ceci:
Cependant, personne ne fait cela dans VB .NET. Ce serait idiot, car depuis la première version de .NET, vous avez pu le faire ...
... qui crée la variable et l'initialise en une seule ligne raisonnablement compacte. Ah, mais si tu veux un
IList<string>
, pas unList<string>
? Eh bien, dans VB .NET, cela signifie que vous devez le faire:Tout comme vous devriez le faire en C #, et ne pouvez évidemment pas l'utiliser
var
pour:Si vous avez besoin que le type soit différent, cela peut l'être. Mais l'un des principes de base d'une bonne programmation est de réduire la redondance, et c'est exactement ce que fait var.
la source
var
en C # n'a aucune connexion avecvar
JavaScript. Unevar
variable déclarée en C # est fortement typée.Utilisez-le pour les types anonymes - c'est pour ça qu'il est là. Tout le reste est une utilisation trop loin. Comme beaucoup de gens qui ont grandi sur C, j'ai l'habitude de regarder à gauche de la déclaration pour le type. Je ne regarde pas du côté droit, sauf si je dois le faire. Utiliser
var
pour toute ancienne déclaration me fait le faire tout le temps, ce que je trouve personnellement inconfortable.Ceux qui disent «ça n'a pas d'importance, utilisez ce dont vous êtes satisfait» ne voient pas l'image entière. Tout le monde récupérera le code des autres à un moment ou à un autre et devra faire face à toutes les décisions qu'il aura prises au moment de l'écrire. C'est déjà assez dommage de devoir faire face à des conventions de dénomination radicalement différentes, ou - le reproche classique - à des styles de contreventement, sans ajouter le tout ``
var
ou pas '' au mélange. Le pire des cas sera celui où un programmeur n'a pas utilisévar
, puis vient un responsable qui l'aime et étend le code en l'utilisant. Alors maintenant, vous avez un désordre impie.Les normes sont une bonne chose précisément parce qu'elles signifient que vous êtes beaucoup plus susceptible de pouvoir récupérer du code aléatoire et de le bloquer rapidement. Plus il y a de choses différentes, plus cela devient difficile. Et le passage au style «var partout» fait une grande différence.
Cela ne me dérange pas de taper dynamiquement, et cela ne me dérange pas de taper implicitement - dans des langues qui sont conçues pour eux. J'aime bien Python. Mais C # a été conçu comme un langage typiquement explicite et c'est ainsi qu'il devrait rester. Briser les règles pour les types anonymes était déjà assez mauvais; laisser les gens aller encore plus loin et briser encore plus les idiomes de la langue est quelque chose dont je ne suis pas satisfait. Maintenant que le génie est sorti de la bouteille, il n'y retournera plus jamais. C # deviendra balkanisé dans les camps. Pas bon.
la source
Plusieurs fois pendant les tests, je me retrouve avec un code comme celui-ci:
Maintenant, parfois, je veux voir ce que contient SomeOtherThing lui-même, SomeOtherThing n'est pas du même type que celui renvoyé par CallMethod (). Puisque j'utilise var cependant, je change juste ceci:
pour ça:
Sans var, je devrais également changer le type déclaré sur le côté gauche. Je sais que c'est mineur, mais c'est extrêmement pratique.
la source
Pour les afficionados qui pensent
var
gagner du temps, il faut moins de touches pour taper:que
Comptez-les si vous ne me croyez pas ...
19 contre 21
Je vais vous expliquer si je dois le faire, mais essayez-le ... (selon l'état actuel de votre intellisense, vous devrez peut-être en taper deux de plus pour chacun)
Et c'est vrai pour tous les types auxquels vous pouvez penser !!
Mon sentiment personnel est que var ne doit jamais être utilisé sauf lorsque le type n'est pas connu car il réduit la reconnaissance en lecture dans le code. Il faut plus de temps au cerveau pour reconnaître le type qu'une ligne complète. Les anciens qui comprennent le code machine et les bits savent exactement de quoi je parle. Le cerveau traite en parallèle et lorsque vous utilisez var, vous le forcez à sérialiser son entrée. Pourquoi voudrait-on faire travailler son cerveau plus dur? C'est à ça que servent les ordinateurs.
la source
Je divisé var partout dans les lieux, les endroits que douteux pour moi sont des types internes courts, par exemple , je préfère
int i = 3;
plusvar i = 3;
la source
Cela peut certainement simplifier les choses, à partir du code que j'ai écrit hier:
Cela aurait été extrêmement verbeux sans
var
.Addendum: Un peu de temps passé avec un langage avec une inférence de type réel (par exemple F #) montrera à quel point les compilateurs sont bons pour obtenir le bon type d'expressions. Cela a certainement signifié que j'ai tendance à utiliser
var
autant que possible, et l'utilisation d'un type explicite indique maintenant que la variable n'est pas du type de l'expression d'initialisation.la source
Aucun, sauf que vous n'avez pas besoin d'écrire deux fois le nom du type. http://msdn.microsoft.com/en-us/library/bb383973.aspx
la source