Acabo de comenzar a usar ReSharper con Visual Studio (después de las muchas recomendaciones sobre SO). Para probarlo, abrí un proyecto reciente de ASP.NET MVC. Una de las primeras y más frecuentes cosas que he notado que sugiere es cambiar la mayoría / todas mis declaraciones explícitas a var
cambio. Por ejemplo:
//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
y así sucesivamente, incluso con tipos simples, tales como int
, bool
, etc.
¿Por qué se recomienda esto? No vengo de una ciencia informática o de .NET, habiendo "caído en" el desarrollo de .NET recientemente, así que realmente me gustaría entender qué está pasando y si es beneficioso o no.
var
, ¡incluso cuando el tipo no es obvio en absoluto! la razón es porque me obliga a elegir el nombre más descriptivo que se me ocurre y, en última instancia, eso hace que el código sea mucho, mucho más legible. En última instancia, también ayuda a separar la lógica de la implementación. Por supuesto, esa es solo mi opinión, espero que ayude a alguien;).Respuestas:
Una razón es la legibilidad mejorada. ¿Cual es mejor?
o
fuente
var
para todo - me hacen montones y montones de revisiones de código utilizando TFS (diferenciaciones basadas en web) y hace que mi trabajo extremadamente difícil: es decirvar items = GetSomeItems();
vsIDataReader dr = GetSomeItems();
Missing instrucción using de ambos, pero más fácil para mí para coger al utilizarIDataReader
vsvar
.Lo que sugiere ReSharper es claramente el uso excesivo de la palabra clave var. Puede usarlo donde el tipo es obvio:
Si el tipo no es obvio, debería escribirlo:
fuente
var
es una cuestión de opinión, y no "claramente" una cosa u otra. Prefiero no escribir cosas que el compilador puede resolver por sí mismo. Me gusta la inferencia de tipo C #, y a menudo desearía que fuera tan buena como la inferencia de tipo F #. Si pudiera, dejaría de lado los tipos explícitos de los parámetros del método y los tipos de retorno, como es la norma en F #. No todos están de acuerdo, por supuesto.Stream
objeto, por ejemplo, se llamaRead
, noReadAndReturnNumberOfBytesAsInt32
.Personalmente prefiero desactivar esta sugerencia. El uso a
var
menudo puede mejorar la legibilidad; pero como mencionó, a veces lo reduce (con tipos simples, o cuando el tipo resultante es oscuro ).Prefiero elegir cuándo lo uso
var
y cuándo no. Pero de nuevo, solo soy yo.fuente
var
bastante frecuencia también.var methodXYResultIntArray
. Eso va en contra de todos los estándares de codificación y es menos conciso queint[] methodXYResult
. Si desea devolver abyte[]
del método en el futuro, todos sus nombres de variables son incorrectos. Con tipos explícitos puedes refactorizar esto muy fácilmente. Hay razones para usarvar
, fe con aDictionary<string, List<SomeType<int>>>
. Pero si el nombre de tipo completo no es demasiado largo y no lo usanew
en el lado derecho (o un reparto explícito), no debería sugerirlo.var
puede aumentar la legibilidad del código al tiempo que disminuye la comprensión inmediata del código. De todos modos, puede disminuir la legibilidad del código para otras situaciones. A veces su uso es neutral. La medida de legibilidad para la comprensión no es proporcional, sino que depende de la situación. A veces, ambos aumentan o disminuyen juntos.El factor es a qué se
var
está aplicando y qué tan bien el objetivo admite la ofuscación inmediata de su tipo de datos al lector, o si su información de tipo es necesaria para comprender la parte del programa en cuestión.Por ejemplo, una mala denominación puede provocar
var
una disminución de la comprensión del código. Sinvar
embargo, esto no es culpa suya:A veces no tiene sentido usar
var
para tipos de datos simples cuando el código es más legible en su ausencia:A veces
var
puede ser útil para ocultar información del tipo de datos que no necesariamente le interesa ver las complejidades de:Usted debe utilizar
var
cuando hay un tipo presente en el anonimato porque no hay un nombre de tipo de llamarlo por:Cuando Visual Studio Intellisense proporciona información de tipo a pesar de ello
var
, debe confiar menos en su comprensión mediante la lectura estricta de códigos sin ayuda. Probablemente sea prudente suponer que no todos pueden tener o usar Intellisense.En resumen, en base a los ejemplos anteriores, sugeriría que la aplicación de carte blanche
var
no sea una buena idea porque la mayoría de las cosas se hacen mejor con moderación y en función de las circunstancias en cuestión, como se muestra aquí.¿Por qué Resharper lo usa todo de manera predeterminada? Sugeriría facilidad, porque no puede analizar los matices de las situaciones para decidir cuándo es mejor no usarlo.
fuente
var
, te obligará a escribir nombres de métodos decentes.GetNumber() -but what type?
- bueno, ¿por qué te importa? Si es tan importante saberlo, llame al métodoGetNumberAsDouble()
, entonces es igual de claro y funcionará si tiene un método que regresastring
y otro que regresadouble
.En ReSharper (8.02, pero probablemente en otras versiones), la opción para la sugerencia "Usar declaración de variable local tipada implícitamente" se puede ajustar a su preferencia , sea lo que sea, abriendo primero el menú de opciones para ReSharper:
Luego, en "Código de inspección" ajustando la "Severidad de inspección" del idioma elegido, en mi caso c #:
Como puede ver, hay opciones para ajustar todas las sugerencias que hace ReSharper. Espero que esto ayude a alguien como yo que ya tiene una estrategia de uso 'var' y solo quiere que ReSharper la respete :)
fuente
Me sorprende que nadie haya mencionado que también es más fácil cambiar el tipo de objeto instanciado, porque
Es una forma de repetición . Si quiero cambiar
AVeryLongTypeName
a una de sus clases derivadas, solo necesito cambiar esto una vez cuando lo usevar
y aún puedo acceder a los métodos de las clases secundarias.Aparte de eso, la legibilidad mejorada es un punto importante, pero como otros dijeron, var no debe usarse en exceso, por lo que creo que desactivar la sugerencia en Resharper está absolutamente bien.
fuente
'var' se trata de ser claro
El debate principal acerca de si usar la
var
palabra clave o no es sobre qué tan legible es el código para usted y otros desarrolladores.Al igual que si estuviera escribiendo una historia, no hay una respuesta correcta definitiva. Pero veamos algunos ejemplos de esto en inglés simple.
¿Quién fue por el otro lado? Jake o Bill? En este caso, usar los nombres "Jake" y "Bill" es como usar el nombre del tipo. Y "Él" y "él" es como usar la
var
palabra clave. En este caso, podría ser más específico. Lo siguiente, por ejemplo, es mucho más claro.En este caso, al ser más específico, la oración fue más clara. Pero ese no siempre será el caso. En algunos casos, ser específico hace que sea más difícil de leer.
En este caso, sería más fácil leer la oración si usáramos "él" y, en algunos casos, omitiéramos su nombre, lo que equivale a usar la
var
palabra clave.Esos ejemplos cubren la esencia, pero no cuentan toda la historia. En esos ejemplos solo había una forma de referirse a la persona. Ya sea usando su nombre o usando un término más general como "él" y "él".
En el caso del código, tenemos 3 formas de ayudar a agregar claridad. El tipo, el nombre de la variable y la asignación. Tome esta línea de código, por ejemplo:
La pregunta ahora es si hay suficiente información en esa línea de código para ayudarlo a descubrir qué está pasando.
¿Qué pasa con la siguiente línea de código? ¿Sabrías lo que
p
significa en este caso?Que tal ahora:
O ahora:
O este:
O esto:
Si la palabra clave
var
funciona en un escenario determinado depende mucho del contexto del código, como cómo se nombran las variables, las clases y los métodos. También depende de la complejidad del código y del resto del código que lo rodea.Personalmente, me gusta usar la
var
palabra clave, es más completa para mí la mayor parte del tiempo. Pero también tiendo a nombrar mis variables después del tipo, así que realmente no estoy perdiendo ninguna información.Dicho esto, a veces, dependiendo del contexto, hago excepciones, tal es la naturaleza de cualquier cosa compleja, y el software no es más que complejo.
fuente
var
siempre y cuando sepa qué es mientras leo esa línea. Si no tengo idea de qué está regresando un método de otra Solución que usa un modelo de dominio diferente, prefiero tener ese tipo definido explícitamente, lo que hace que sea mucho más fácil de leer. +1No me gustó esto también.
No quiero que esto se convierta en un debate sobre el uso de
var
, tiene sus usos, pero no debe usarse en todas partes.La clave para recordar es que ReSharper está configurado con los estándares de codificación que desee.
Editar: ReSharper y var
fuente
Veo muchas respuestas correctas, pero me falta la respuesta completa.
Es cierto que ReSharper sobreutiliza
var
por defecto. Creo que la mayoría de la gente estaría de acuerdo con eso. También es más fácil de leer cuandovar
se usa y el tipo es obvio, como cuando se usa unanew
declaración. Vi una publicación que mostraba cómo actualizar la gravedad de la inspección para mostrar solo sugerencias para el uso devar
.Intenté comentar en otras publicaciones primero para agregar dónde establecerlas, pero no tenía la reputación de hacerlo. Aparentemente, tampoco tenía la reputación de publicar mi captura de pantalla de la configuración.
Te explicaré cómo llegar.
En Visual Studio> Menú principal> Resharper> Opciones> Edición de código> C #> Estilo de código> Uso de Var en declaraciones
Documentación de ayuda de ReSharper: estilo de sintaxis de código : escritura implícita / explícita (palabra clave 'var'): configure las preferencias de uso de la palabra clave 'var'
fuente
Mi regla es esta:
¿Está declarando un tipo primitivo (es decir
byte
,char
,string
,int[]
,double?
,decimal
, etc.)? -> Usa el tipo:¿Está declarando un tipo complejo (es decir
List<T>
,Dictionary<T, T>
,MyObj
)? -> Usovar
:fuente
string myStr = "foo";
es obvio que es una cuerda. Pondría todos sus ejemplos en el uso de la categoría var ... y las declaraciones que son retornos de un método para usar el tipo de explicidad. Pero al final del día, es lo que usted y su equipo sientan que es mejor para el proyecto en particular.Solo me gustaría señalar que se recomienda el uso de "var" en las Convenciones de codificación de C #
así que probablemente por eso la sugerencia está activada por defecto en ReSharper. También proporcionan algunos casos en los que no mejoraría la legibilidad justo debajo del mismo documento.
fuente
System.Diagnostics.PerformanceCounter()
: puedes distinguir fácilmente el contador de rendimiento de la clase de diagnóstico incorporada. ¿Pero qué tipo se devuelve aquí?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)
? No hay indicios de sincronización, especialmente si tiene más de 100 proyectos en su solución.ReSharper recomienda
var
porque tiende a despejar la creación de objetos.Compare estos dos ejemplos:
Es solo una taquigrafía que se supone que es más fácil de leer.
Creo que está bien cuando creas nuevos objetos explícitamente con "nuevo". Sin embargo, en su ejemplo, puede que no sea obvio si las clases no se nombraron correctamente.
fuente
Por cierto, ReSharper establece una distinción entre "es posible que desee aplicar esta sugerencia a su código" y "su código está roto, ¿quiere que lo solucione?". La
var
palabra clave se encuentra en la categoría de sugerencias, junto con cosas como "invertir si para reducir el anidamiento"; No tienes que seguirlo.Puede configurar qué tan molestas son cada una de sus alertas a través del cuadro de diálogo Opciones, o directamente a través del menú emergente para esa alerta. Puede degradar cosas como la
var
sugerencia para que sean menos prominentes, o puede actualizar cosas como la alerta 'usar método de extensión' para que aparezca como un error real.fuente
La
var
característica de .Net 3.0 es solo inferencia de tipos , que es segura y a menudo hace que su código sea más fácil de leer. Pero no tiene que hacerlo, y puede desactivar esa recomendación en un compartidor si lo desea.fuente
¡Var es asombroso! Me he encontrado con muchos desarrolladores que tienen la impresión de que
var
está vinculado a un tipo dinámico, no lo es. Todavía está estáticamente tipado, solo lo decide el compilador.Aquí hay algunos aspectos positivos sorprendentes de usar var
Menos escribir var es más corto y más fácil de leer, por ejemplo,
Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()
Yuk.var postcodes = new Dictionary<int,IList<string>>()
\ o / \ o /Nombres de variables más descriptivos : tenue pero creo que es importante dejar que la naturaleza fluida del
var
brillo brille aquí. Comovar
es un poco vago, realmente fomenta un nombre de variable más descriptivo en lugar de dejar que el tipo hable por sí mismo.Menos cambios de código : si cambia el tipo de retorno de una llamada a método. Solo tiene que cambiar la llamada al método, no todos los lugares donde se usa.
Tipos anónimos: los tipos anónimos son un concepto realmente poderoso, especialmente en áreas como los recursos parciales de WebApi . Sin var, no se pueden usar.
Sin embargo, a veces es útil declarar explícitamente tipos y esto me parece más útil en primitivas o estructuras. Por ejemplo, personalmente no encuentro esta sintaxis muy útil:
vs
Todo
var
depende de las preferencias personales, pero el uso realmente acelerará su desarrollo y desbloqueará todo un mundo de bondades de tipo anónimo.fuente
No hay diferencia técnica, si utiliza var, el compilador implica el tipo. Si tienes un código como este:
se supone que x es un int y no se le pueden asignar otros valores.
La palabra clave var es útil si cambia el tipo de la variable; entonces solo tiene que hacer un cambio en lugar de dos:
fuente
La
var
palabra clave se introdujo en C # 3.0; nos permite olvidar especificar nuestro tipo explícitamente.No hay una diferencia real entre si usas
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
o
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
excepto pura legibilidad y menos posibilidades de error.
Parece un ejemplo cliché, pero digamos que lo siguiente puede ayudarlo a comprender:
devuelve un
int
tipo, mientras quedevuelve un
string
tipoReferencia de MSDN
fuente
Especificar un tipo de objeto explícito es de alguna manera redundante. Incluso traducido al inglés, suena redundante: "poner un objeto de tipo X en una variable de tipo X" vs "Poner un objeto de tipo X en una variable".
Sin embargo, el uso de 'var' tiene sus limitaciones . Impide el uso a continuación del polimorfismo, que es pura belleza :
Supongamos que un perro extiende animal; Cat extiende la jerarquía de clases de animales:
El mismo código, con x declarado con 'var' no se compilará .
De todos modos, volviendo a la pregunta original, no uso Resharper, pero supongo que es lo suficientemente inteligente como para detectar cuándo no usar 'var'. :-)
fuente
as
) es horrible horrible. Convierte los errores de compilación en errores de tiempo de ejecución si tiene algo comoAnimal x = new Cat(); DoStuffWithDog(x as Dog);
¿Por qué reutilizar x? Perro x = nuevo perro (), gato y = nuevo gato (), auge no más ambigüedad posible.Animal
a métodos que tomanDog
yCat
. El polimorfismo es la inversa: lo que puede pasar objetos de tipoDog
yCat
en un método que tomaAnimal
, por ejemplovoid Walk(Animal a)
:Walk(new Cat())
,Walk(new Dog())
En mi opinión,
var
solo debería usarse cuando está claro de inmediato cuál es el tipo al definir el valor de la variable.Ejemplo:
Es obvio que
s
es unstring
.Creo que también es apropiado cuando el nombre del tipo de variable es muy complejo.
Ejemplo:
Aparte de estos escenarios, no veo que se gane nada mediante el uso
var
, pero puedo pensar en algunos escenarios en los que puede ser perjudicial:Por ejemplo, un tipo desechable cuyo valor variable del lado derecho no muestra claramente el tipo. Desechar el ID desechable puede olvidarse fácilmente
Ejemplo:
fuente
'var' agrega una especie de elemento "dinámico" a su código (aunque el código permanece, por supuesto, estrictamente escrito). Aconsejo no usarlo en casos donde el tipo no está claro. Considere este ejemplo:
Si el tipo de retorno de GetTheObjectFromDatabase () se cambia de tipo A a B, no lo notaremos, ya que ambas clases implementan DoSomething (). Sin embargo, el código ahora puede hacer algo completamente diferente.
Esto puede ser tan sutil como que ambos escriban cosas diferentes en un registro, por lo que es posible que no note que es demasiado tarde.
El siguiente uso de var siempre debe estar bien:
fuente
Para aquellos a los que no les gusta el uso constante de "var", también puede evitar que ReSharper se convierta en var por defecto al hacer "introducir variable". Esto fue algo que me frustró durante mucho tiempo, siempre estaba predeterminado a var, y lo cambiaba cada vez.
Esta configuración se encuentra en Edición de código> C #> Estilo de código
fuente
No hay diferencia técnica (como señaló eWolf). Puede usar uno u otro, el código CLR generado se verá igual.
En mi opinión, el principal beneficio es que esto tiende a obligarlo a usar una mejor denominación variable. En su ejemplo, 'foo' es una elección bastante pobre para un nombre de variable.
fuente
Según JetBrains (el autor de ReSharper), fomentan el uso de var por defecto.
Desde su sitio web :
fuente