ReSharper y var [duplicar]


Posible Duplicado:
¿Por qué ReSharper quiere usar ' var ' para todo?

Tengo ReSharper 4.5 y lo he encontrado invaluable hasta ahora, pero tengo una preocupación;
Parece querer hacer que cada declaración de variable sea 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ña.

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 los 5 a var. He leído el siguiente post similar, Uso de la palabra clave var en C#, pero me gustaría saber desde el punto de vista de ReSharper.

Author: Community, 2009-04-10

7 answers

No es necesario 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: Voy a añadir una vista controvertida en él. A menos que esté leyendo 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 el .GetTableRectangle (e. Index), para el que no está mostrando el código que opera en él:

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

Al leer que código específico obtendré más para entenderlo de las operaciones en itemRect que de su tipo. Puede ser IRectangle, Rectangle, CustomRectangle, y todavía no dirá mucho sobre lo que el código está haciendo con él. En lugar de eso, me importa más el artículo.Altura, itemRect.Ancho o itemRect.getArea() junto con la lógica involucrada.

Actualización 2: Como otros han señalado, puedes desactivarla. Asegúrate de mantener al equipo con las mismas prácticas, o probablemente terminarás haciendo cambia de una forma u otra cada vez que una persona diferente toca el código. Véase: http://www.jetbrains.com/resharper/features/codeTemplate.html

 16
Author: eglasius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-10 16:38:11

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 devueltos de cualquiera de esas funciones cambian a un tipo compatibile, 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 solas, porque me gusta ver el nombre del tipo de una variable explícitamente listed somewhere on the line where the variable is declared. En todo caso, podría buscar una interfaz para usar en su lugar, de modo que también obtenga la misma "genérica" 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.

 42
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-09 16:08:58

Resharper no quiere que uses var, te está dando la opción. Si usas var entonces te dará la opción de usar un tipo explícito, por lo que no puedes ganar:-).

EDITAR - interesante enlace discutiendo el tema.

Parece que se puede desactivar, vaya a Resharper -> Options -> Code Inspection -> Inspection Severity y desplácese hacia abajo un poco para ver las opciones relacionadas con var.

 14
Author: Steve Haigh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-10 15:08:06

Resharper piensa que es la mejor práctica, pero algunas personas no están de acuerdo como lo has leído en la publicación vinculada. Me gusta usar la declaración explícita para aumentar la legibilidad,pero para cada uno lo suyo. Si desea utilizar una declaración explícita, puede desactivar la regla en Resharper.

 6
Author: Mark Sherretta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-10 14:47:18

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, la forma más detallada es más legible en un pedazo de papel o-como usted señaló-un libro, pero ninguno de mi código ha aparecido en un libro todavía.

Ahora, le pregunté a un compañero de trabajo mío hace un tiempo acerca de este intAmount negocio y sacó 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 con solo pasar el cursor sobre la variable.

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

 6
Author: jedmao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-09 23:26:13

Esta pregunta es una muy buena manera de comenzar una guerra de llamas. Sin embargo, usted debe hacer lo que usted y con quien usted está trabajando piensa que es más legible. Hay buenos argumentos para ambas partes del debate sobre el var.

Dicho esto, si crees que es más legible declarar explícitamente el tipo, ese es tu negocio. No tienes que hacer todo lo que Resharper te diga. Incluso puede desactivar esa regla si lo desea.

 0
Author: dustyburwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-10 14:48:08

De hecho puedes apagarlo, y yo lo he hecho. Admito que es bueno en algunos casos donde 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 cambiara. No creo que sea una buena idea usarlo cuando se asigna una variable desde el valor devuelto de un método (como en su segunda línea), porque podría no estar claro de inmediato qué tipo de variable es exactamente devoluciones.

 0
Author: ryeguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-10 15:03:05