2009-01-09 10 views
29

Actualmente estoy usando la versión de prueba de 30 días de ReSharper, y hasta ahora me han impresionado las sugerencias que hace. Sin embargo, una sugerencia me desconcierta.C# 'var' palabra clave contra las variables explícitamente definidas

Cuando definir explícitamente una variable, como por ejemplo:

List<String> lstString = new List<String>(); 

ReSharped añade un poco de línea ondulada verde y me dice que:

Uso implícitamente el tipo de declaración de variables locales.

si yo sigo su sugerencia, ReSharper cambia la línea de código a:

var lstString = new List<String>(); 

Entonces, ¿hay algún tipo de ganancia en el rendimiento que se obtienen de cambiar el List<String> a un var, o es esto simplemente una peculiaridad de ReSharper? Siempre me han enseñado que definir de forma explícita una variable, en lugar de usar una dinámica, es más óptimo.

+0

var es diferente a la dinámica de palabras clave, también compilador va a convertir palabras clave var al mango tipo real – erdogany

Respuesta

60

Entonces, ¿hay algún tipo de ganancia en el rendimiento que se obtienen de cambio de la lista a un var

No, pero esta no es la única razón válida para una refactorización. Más importante aún, elimina la redundancia y reduce el código sin perder claridad.

Siempre me han enseñado que definir de forma explícita una variable, en lugar de utilizar una dinámica, es más óptimo.

No entiende lo que significa var. Esto es no de ninguna manera dinámica, ya que produce la misma salida. Simplemente significa que el compilador calcula el tipo de la variable por sí mismo. Obviamente es capaz de hacerlo, ya que este es el mismo mecanismo que se utiliza para probar la seguridad y corrección del tipo.

También elimina una duplicación de código completamente inútil. Para tipos simples, esto podría no ser mucho. Pero considere:

SomeNamespace.AndSomeVeryLongTypeName foo = new SomeNamespace.AndSomeVeryLongTypeName(); 

Claramente, en este caso, doblar el nombre no es solo innecesario, sino realmente dañino.

+1

Gracias por la aclaración de que 'var' no es lo mismo que dinámico, no me di cuenta de eso. – JustinT

+1

+1 buena explicación. – JonH

12

Nope. Emiten exactamente el mismo IL.

Es solo una cuestión de estilo.

var tiene la ventaja de que le facilita cambiar el tipo de retorno de las funciones sin alterar otras partes del código fuente. Por ejemplo, cambie el tipo de devolución de IEnumerable<T> a List<T>. Sin embargo, podría facilitar la introducción de errores.

+6

En realidad, este es un mal uso de la var. Solo se debe usar cuando el tipo sea evidente por el contexto. Si puede cambiar el tipo de devolución de un método sin cambiar su nombre, entonces no debe usar var porque el tipo involucrado no es obvio. –

+0

@Stephen: ¿Por qué es malo cuando el tipo de expresión no es inmediatamente obvio? –

+3

El uso de var como un símbolo ambiguo reduce severamente la legibilidad y la comprensibilidad. La comprensión rápida del tipo de objeto al leer el código conduce a una comprensión mucho más rápida y elevada. –

8

La palabra clave var en realidad no declara una variable con un tipo dinámico. La variable todavía está tipada estáticamente, solo deduce el tipo del contexto.

Es un buen acceso directo cuando se tiene un largo nombre de tipo (typenames genéricos pueden ser largos)

+0

Lo más importante es que no se puede asignar un int a var un momento y una cadena al siguiente, como se puede hacer con tipos dinámicos reales. Una vez que se establece el tipo, está atascado de esa manera. Aún recibes soporte completo de intellisense y todo. –

1

teclear menos = más productividad :)

+3

En realidad: menos legibilidad = menos productividad –

+3

Bueno, entonces var es mejor. var es a menudo más legible, simplemente porque hay mucha menos lectura que hacer. –

+1

Las únicas veces que var es más legible es en el caso de crear objetos con nombres de tipo extremadamente largos (a menudo genéricos) como sugiere Konrad. Allí, la var puede coincidir con el tipo casi al instante y la eliminación de la gran cantidad de caracteres adicionales mejora la comprensibilidad. –

Cuestiones relacionadas