2010-10-29 6 views
16

Possible en double:
C# 'var' vs specific type performancevar Utiliser ou ne pas utiliser var

Salut à tous, je
récemment vu le code qui utilise var beaucoup.
.: par exemple

var myString = GetAnyString(); 
var myInstance = GetClass(); 

au lieu de

string myString = GetAnyString(); 
MyClass myInstance = GetClass(); 

Outre la lisibilité (je pense que l'utilisation var n'est pas très lisible), sont-il des avantages et/ou inconvénients de l'utiliser? Que diriez-vous de la performance

+0

"C# 'var' vs performance de type spécifique" question ne couvre pas la question posée. –

+0

Il y a beaucoup de discussions sur 'var' sur le site sur divers aspects de celui-ci. De la performance (qui a été choisi), la praticité de son utilisation, la nature subjective de la raison pour laquelle il est utilisé en premier lieu, etc Tous sont toujours d'actualité aujourd'hui. Faites votre choix, c'est un doublon. –

+1

"Outre la lisibilité (je pense qu'utiliser var n'est pas très lisible)" - non, var est plus lisible que les mentions redondantes du type, ce qui est une des raisons pour lesquelles les langages modernes ont une inférence de type. "Que diriez-vous de la performance?" - cela suggère un malentendu sévère des bases de la langue ... C# est typé statiquement. –

Répondre

11

var est remplacé par le compilateur avec le bon type, donc il n'y a pas de coup de performance d'exécution, à part fr om un très petit temps de compilation peut-être (veeeeeeeery petit).

En fait, d'un point de lisibilité de vue, je fais personnellement comme suit:

  • Variable instanciation: object myVar = new object();

  • propagation variable: var myVar = anotherVar.getComplexObject();

De plus, vous pourriez être tenté de les utiliser lorsque vous avez une instanciation de type très complexe, comme:

var myDict = new Dictionary<string, List<Tuple<string, object>>>(); 

Ici, cela améliore vraiment la lisibilité.

+2

Actuellement, en train de travailler sur un projet Java, je suis TRES frustré que le mot clé var soit indisponible Java, surtout lors de la propagation de variables, quand vous ne voulez pas chercher dans la documentation pour savoir quel type est cette variable eu et comment l'écrire correctement. –

+13

Comment pouvez-vous savoir comment utiliser la variable si vous ne connaissez pas son type? – Goldorak84

+1

Comme une curiosité: dans Java 7+, l'exemple 'Dictionary' ci-dessus peut être écrit comme suit: Map >> myMap = new HashMap <>();', en utilisant le nouveau "opérateur de diamant" (bien, sauf qu'il n'y a pas de type "Tuple" dans le JDK). –

4

y a-t-il des avantages et/ou des inconvénients à l'utiliser?

Un avantage: moins de typage.

(je pense que l'utilisation de var n'est pas très lisible)

Je suis partiellement d'accord avec ce point. Il est moins lisible quand vous avez var s = foo(); au lieu de string s = foo;. Dans d'autres cas, il peut être plus lisible.

Que diriez-vous des performances

Lors de l'exécution il n'y a pas de différence. Le compilateur le convertit dans le même code intermédiaire que si vous aviez déclaré explicitement le type.

+1

"Il est moins lisible quand vous avez var s = foo(), au lieu de string s = foo;" - les problèmes de lisibilité viennent entièrement d'avoir des noms dénués de sens. Sachant qu'une chose avec un nom sans signification obtenu à partir d'une méthode avec un nom sans signification est une chaîne n'aide pas. J'utilise maintenant var/auto comme filtre d'interview ... les gens qui pensent que l'inférence de type rend le code moins lisible ne sont pas embauchés. –

+1

Jim Balter dites-vous que le nom de la variable devrait déduire le type? Parce que cela ressemble à annuler votre "var" pour moi, c'est à dire plus de dactylographie – Epirocks

20

C'est subjectif, mais je n'aime pas utiliser les vars. Quant à moi, ils n'améliorent pas la lisibilité.

Mais règle générale sur l'utilisation var suit:

Utilisez var quand il est tout à fait clair quel type de la variable est déclarée:

Dictionary<string, Dictionary<string, string>> varOfSomeLongType = new Dictionary<string, Dictionary<string, string>>(); 

ou lorsque vous déclarez la variable de type anonyme:

var linqResult = from element in SomeCollection 
       select new { element.A, element.B } 
+7

LINQ est l'une des rares situations où utiliser var à mon avis. –

+0

Je pense que c'est plus que @Andrew Bezzub utilisait LINQ pour faire un type anonyme. Une grande partie de mon expérience (qui diffère probablement de beaucoup d'autres personnes), j'ai généralement besoin des résultats de la requête LINQ immédiatement, et/ou les types LINQ crache en arrière sont encore assez lisibles. Si ça commence à devenir trop moche, j'essaie en général de réévaluer comment je vais, parce que ça devient dangereusement difficile à maintenir à ce moment-là, de toute façon. Si j'utilise var, c'est beaucoup plus difficile à repérer et à corriger. – Gurgadurgen