2009-03-16 25 views
63

Acabo de instalar una versión de prueba de ReSharper y una de las primeras cosas que noté es que siempre se sugiere para reemplazar las variables locales escritas explícitamente implícitamente mecanografiadas queridos, por ejemplo:Uso de variables locales implícitamente mecanografiadas

public string SomeMethod(int aParam) 
{ 
    int aNumber = SomeOtherMethod(aParam); 
    // should be changed to: 
    var aNumber = SomeOtherMethod(aParam); 
} 

I pensar que las variables explícitamente tipadas son más legibles (más explícitas).

¿Qué opinas sobre la sugerencia de ReSharper? ¿Hay alguna ventaja en el uso de variables tipadas implícitamente? ¿Cuándo usas los vars implícitos/explícitos?

+0

Dup: http://stackoverflow.com/questions/545616/why-would-var-be-a-bad-thing, http://stackoverflow.com/questions/633474/poll-c-do-you -use-var –

+0

sí, y http://stackoverflow.com/questions/236878/what-to-use-var-or-object-name-type – Razzie

+0

Puede indicar a Resharper que establezca de forma predeterminada las variables explícitas ... o en al menos podrías cuando hice la prueba el año pasado –

Respuesta

74

yo personalmente sólo uso “var” cuando puedo distinguir claramente la variable Tipo con sólo leer la declaración, por ejemplo:

var someVariable = new List<int>(); 

En el ejemplo anterior, es evidente ese "var" se refiere a "List <int>".

No me gusta usar "var" cuando tengo que ir a alguna definición de método para averiguar qué tipo de variable "var" representa o al tener que depender de visual studio intelli-popup o lo que se llame, por ejemplo, en esta no está bien para mí:

var someVaraible = SomeMethod(); 

es decir, lo que se supone que la función “SomeMethod” para volver? ¿Puedes decir solo mirando la línea de código? No, no puedes, así que es por eso que evito usar "var" en esas situaciones.

6

Simplemente es más fácil escribir var pseudo-keyword a veces que un nombre de tipo enorme, especialmente si se trata de un genérico. Sin embargo, debes saber que son funcionalmente idénticos. No hay diferencia de rendimiento ni nada de ninguna manera. El compilador deriva el tipo del lado derecho de la asignación y reemplaza var con ese tipo. No está sucediendo en tiempo de ejecución como una variante de VB.

39

Hay mucha discusión sobre esto, pero creo que todo se reduce al gusto personal, al igual que el uso de la palabra clave 'this' en casi todas partes.

I personalmente prefieren las variables explícitamente tipadas, pero cuando se usan colecciones genéricas anidadas, las cosas pueden volverse más legibles usando una variable implícitamente tipada. Mira:

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

vs:

var myDictionary = new Dictionary<string, Dictionary<string, string>>(); 

EDIT: este tema SO cubre el mismo tema, con algunas respuestas bonito: What to use: var or object name type?

Edit2: Trabajar mucho con asíncrono hoy en día, me parece que el uso de variables tipo explicity a veces puede evitar errores desagradables. Considere este ejemplo tonto en el que le gustaría devolver el Id de un usuario. También considere que GetUserAsync devuelve Task<User>. Si utiliza variables implícitamente con tipo, terminarían usando algo como esto:

public long GetUserId() 
{ 
    var user = GetUserAsync(); 
    return user.Id; 
} 

Esto compila, pero es un error. 'usuario' es en realidad un Task<User>. Y compila como Task también tiene una propiedad Id. En este caso, uno devolvería accidentalmente el ID de una tarea en lugar del usuario.

public long GetUserId() 
{ 
    User user = GetUserAsync(); 
    return user.Id; 
} 

Lo anterior no se compila, como el compilador se quejará de que no se puede echar una tarea a un usuario. Agregar la palabra clave await por supuesto resuelve esto.

De hecho, he tenido que esto ocurra a mí una vez :-)

6

Fwiw, la palabra clave var es claramente legible en muchos casos. Especialmente si ...

  1. El lado derecho de la asignación es una expresión de constructor.

    var map = new Diccionario>();

  2. Las variables locales tienen buenos nombres.

HTH

17

En caso de que algunos no lo hayan notado aún, puede cambiar fácilmente las "sugerencias" en Reshaper (Reshaper -> Opciones -> Idiomas -> Acciones de contexto -> "Reemplazar especificación de tipo explícita con 'var'").

Personalmente, prefiero tener especificaciones de tipo explícito en todas partes, pero no soy demasiado quisquilloso.

+3

Otra opción para deshabilitar está en: Inspección de código ==> Gravedad de inspección ==> C# ==> Utilice la palabra clave 'var' cuando el inicializador declare explícitamente el tipo y use la palabra clave 'var' cuando sea posible – ThisGuy

Cuestiones relacionadas