2009-04-10 17 views
45

Duplicar posible:
Why does ReSharper want to use 'var' for everything?ReSharper y var

tengo ReSharper 4.5 y han encontrado que es muy valiosa hasta ahora, pero tengo una preocupación;
Parece querer hacer que cada declaración de variable implícita (var).
Como relativamente nuevo desarrollador, ¿cuánto debo confiar en ReSharper cuando se trata de esto?

Tome el siguiente fragmento de código de un método que Pinta encabezados de pestañas.

TabPage currentTab = tabCaseNotes.TabPages[e.Index]; 
Rectangle itemRect = tabCaseNotes.GetTabRect(e.Index); 
SolidBrush fillBrush = new SolidBrush(Color.Linen); 
SolidBrush textBrush = new SolidBrush(Color.Black); 
StringFormat sf = new StringFormat 
{ 
    Alignment = StringAlignment.Center, 
    LineAlignment = StringAlignment.Center 
}; 

ReSharper quiere que cambie todos los 5 de los de var. He leído la siguiente publicación similar, Use of var keyword in C#, pero me gustaría saber desde el punto de vista de ReSharper.

Respuesta

16

No necesita tener el tipo en la línea para que sea más legible, es una cuestión de preferencia personal. Me gusta la variación var:

var currentTab = tabCaseNotes.TabPages[e.Index]; 
var itemRect = tabCaseNotes.GetTabRect(e.Index); 
var fillBrush = new SolidBrush(Color.Linen); 
var textBrush = new SolidBrush(Color.Black); 
var sf = new StringFormat 
    { 
     Alignment = StringAlignment.Center, 
     LineAlignment = StringAlignment.Center 
    }; 

Actualización: que añadirá un punto de vista polémico a ella. A menos que esté leyendo el código de un libro, generalmente no me importa cuál es el tipo específico para entender algunas líneas de código que estoy leyendo. Considere la .GetTableRectangle (e.Index), para los que no está mostrando el código que opera en él:

var itemRect = tabCaseNotes.GetTableRectangle(e.Index); 
//do some operations on itemRect 

Al leer ese código específico voy a tener más para entenderlo desde las operaciones en itemRect que desde su tipo. Puede ser IRectangle, Rectangle, CustomRectangle, y aún no dice mucho sobre lo que el código está haciendo con él. En cambio, me preocupo más por el itemRect.Height, itemRect.Width o itemRect.GetArea() junto con la lógica involucrada.

Actualización 2: Como han señalado otros, puede desactivarlo. Asegúrese de mantener al equipo con las mismas prácticas, o probablemente termine haciendo cambios de una forma u otra cada vez que una persona diferente toque el código. Ver: http://www.jetbrains.com/resharper/features/codeTemplate.html

+0

He estado usando var desde hace un tiempo y no pude volver. Cuando trabajo en un proyecto heredado con Resharper, me resulta difícil dejar de hacer un reemplazo global. Nunca he tenido un error que haya sido causado por el uso de var. En estos días, todos los errores están en el código del lado del cliente. Nunca es el C#. El uso de var no afectó la ocurrencia de errores en mi experiencia. –

5

Resharper cree que es la mejor práctica, pero algunas personas no están de acuerdo ya que ha leído en la publicación vinculada. Me gusta usar una declaración explícita para una mayor legibilidad, pero para cada uno la suya propia. Si desea usar una declaración explícita, puede desactivar la regla en Resharper.

0

Esta pregunta es una muy buena manera de comenzar una guerra de llamas. Sin embargo, debes hacer lo que sea que tú y el que estés trabajando piensen que es más legible. Hay buenos argumentos para ambos lados del debate sobre var.

Dicho esto, si cree que es más legible declarar explícitamente el tipo, esa es su tarea. No tiene que hacer todo lo que Resharper le indique. Incluso puede deshabilitar esa regla si lo desea.

+0

algunas personas se preocupan por cada pequeño detalle ... los codificadores a menudo son MBTI-INTJ, y eso a menudo significa ser anal-retentivo y/o quisquilloso. Lamentablemente, a menudo soy ambos. – Hardryv

42

Resharper se ocupa principalmente de ayudarlo a refactorizar el código, y la palabra clave var generalmente facilita la refactorización. Por ejemplo, si los valores de retorno de cualquiera de esas funciones alguna vez cambian a tipo compatible, no tiene que cambiar nada de este código. Por lo tanto, ahora es un poco más fácil refactorizar su tipo tabCaseNotes, por ejemplo.

Personalmente, a menudo me inclino a dejar las dos primeras líneas solo, porque me gusta ver el nombre de tipo de una variable explícitamente enumerada en algún lugar en la línea donde se declara la variable. En todo caso, podría buscar una interfaz para usar, de modo que también obtenga el mismo "carácter genérico" que con la palabra clave var sin perder ninguna información importante de tipo legible. Sin embargo, definitivamente usaría var para fillBrush, textBrush y sf.

+3

Esa es la forma en que uso var. Para las variables que se inicializan con nueva instrucción, utilizo var para otras cuyo tipo no es tan claro. Utilizo el tipo real. –

+0

Me doy cuenta de que esta es una vieja pregunta. Sin embargo, me pregunto en este ejemplo si el uso de 'var' es ideal, en comparación con declarar el uso de una interfaz? Si usa var, se puede asignar cualquier cosa, mientras que con una interfaz se asegura de que el refactor se adhiera a lo esperado. ¿No está usando 'var' como peligroso a este respecto? –

+0

@navigator_ Me perdí el comentario original, pero si cambias algo que rompe el código, var todavía está fuertemente tipado y sigue siendo un error en tiempo de compilación que corriges antes de que alguien vea el problema. Si cambia un método para que devuelva algo que no funciona, el compilador aún lo detecta. –

14

Resharper no quiere para usar var, le está dando la opción. Si usa var, le dará la opción de usar un tipo explícito, por lo que no puede ganar :-).

EDIT - interesante link discutiendo el tema.

Parece que se puede apagar, vaya a Resharper -> Opciones -> Inspección de código -> Severidad de inspección y desplácese hacia abajo un poco para ver las opciones relacionadas con var.

+4

A menudo uso esto para mi ventaja. Es decir, si no estoy 100% seguro de lo que devuelve un método, utilizo 'var' y luego uso un atajo de teclado para hacer que ReSharper convierta' var' al tipo explícito. –

0

De hecho, puede apagarlo, y yo tengo. Admito que es bueno en algunos casos en que el nombre del tipo de clase es largo, como:

SuperDisconfibulator sd=new SuperDisconfibulator(); 

sería un buen candidato para ser acortado a var, pero personalmente esa es la única vez que me gustaría que se cambio. No creo que sea una buena idea usarlo cuando se está asignando una variable desde el valor de retorno de un método (como en su segunda línea), porque puede no estar inmediatamente claro exactamente qué tipo de variable devuelve.

+0

En realidad, prefiero la nomenclatura detallada de nombres, de esa manera, incluso si no la escribí, es probable que tenga al menos una idea de lo que el desarrollador original estaba haciendo. – Hardryv

6

En C#, prefiero usar var en todas partes. ¿Por qué? Por la misma razón que uso firstName en lugar de strFirstName o amount en lugar de intAmount. Claro, el modo más detallado es más legible en un pedazo de papel o, como dijiste, un libro, pero ninguno de mis códigos ha aparecido en un libro todavía.

Ahora, le pregunté a un compañero mío hace un tiempo acerca de este negocio intAmount y sacó a relucir un muy buen punto. Dijo que es útil en un editor de texto directo, pero cuando tienes Intellisense, puedes obtener la misma información y más simplemente pasando el cursor sobre la variable.

Por último, aunque aprecio el medio feliz que otros han señalado (es decir, usando var con la declaración new) y el argumento es válido y fuerte, me inclino a alejarme de eso sobre la única base de consistencia y legibilidad de manos cortas. Mi argumento de coherencia es que si la legibilidad es tan importante para usted, ¿por qué no usa también intAmount para poder decir el tipo de datos más adelante en el código?

+4

Al mirar la publicación está claro por qué su código nunca va a convertirse en un libro. Un método no debería ser tan largo como intAmount (Prácticas de codificación), pero si usas 'var xyz = Silo.GetWeight()' nunca sabrás si el peso es doble, int, float o algo más oscuro, tal vez una estructura con peso y una unidad? Luego, más adelante, intenta hacer una revisión del código y notará que el redondeo puede importar mucho. – Offler

+1

Um, ¿quién dice que escribiría 'var xyz = Silo.GetWeight()'? Yo nunca escribiría eso. Sin embargo, escribiría 'var weight = Silo.GetWeight()' y sabría exactamente el tipo de datos cuando sobrevivo la variable en Visual Studio. Hoy tenemos excelentes herramientas, por lo que no hay ninguna razón para usar la notación húngara. – jedmao

+3

Hovering cuesta tiempo. Las revisiones de código en compañías más grandes generalmente no se realizan en Visual Studio (por ejemplo: conozco muchas soluciones médicas donde la parte completa de VS no se usa en las revisiones. A veces se usa un proyector, principalmente un programa propio (también las compilaciones están completas) Independiente de VS, porque allí puede usar configuraciones que son diferentes para cada programador, el sistema de compilación usa una marca propia con parámetros fijos - VS solo se usa como editor) leyendo directamente 10 líneas de coedes es más rápido que leer, desplazarse, enfocar y etc. Intente hacer un servicio en sistemas heredados. Más legible = beneficio a tiempo – Offler