2008-11-14 12 views
16

Nuestros estándares de codificación solicitan que minimicemos el uso de C# var (sugiere limitar su uso a estar junto con Linq). Sin embargo, hay ocasiones en las que se usan genéricos cuando es razonablemente conveniente, p.Herramienta para refactorizar la var. De C# al tipo explícito

Dictionary<DateTime, Dictionary<string, float>> allValues = ... 
// ... 
foreach (var dateEntry in allValue) 

es más fácil de escribir

foreach (KeyValue<DateTime, Dictionary<string, float>> dateEntry in allValue) 

(y más fácil de recordar lo que el tipo es explícita en algunos casos).

Alguna de las herramientas de refactorización tiene la capacidad de convertir la primera a la última. He echado un vistazo a Resharper, pero parece que no funciona (de hecho, la sugerencia por defecto es ir en la dirección opuesta).

Respuesta

19

Tengo ReSharper 4.1, y ofrece esta opción (en cualquier dirección).

En realidad, recomendaría desafiar el estándar ... el primero es mucho más legible que el segundo (especialmente si llama a la variable pair o algo similar). No utilizaría "var" para var i = 0, pero es ideal para lo anterior.

para cambiar a granel, vaya a:

  • código de limpieza ... (escoja un perfil => "Editar perfiles" => Herramientas => Limpieza de código)
    • C#
      • uso 'var' en la declaración
        • Reemplazar dirección = ¿puede 'var' al tipo de uso
        • estilo
        • 'foreach' declaración de iterador = Usar siempre de tipo explícita
        • estilo de declaración de variable local = Usar siempre de tipo explícita

y correr ...

+0

bonita que has encontrado cómo hacerlo en mayor :) +1 – Bluenuance

+0

Gracias, soy nuevo en ReSharper y no habían encontrado. –

4

Resharper hace esto (solo en la versión 4+ Estoy seguro de ello) pero no sé si es posible simplemente convertir var en el tipo específico automático - eventualmente tiene que ir a la "var" y luego aparece una luz que le da la opción de especificar el tipo explícitamente

0

yo diría que donde hay tipos genéricos complejos en los objetos de su dominio debe typedef ellos

 
class DomainValueCollection : KeyValue<DateTime, Dictionary<string, float>>{} 

donde DomainValueCollection es somehting que tiene sentido en el contexto del dominio

el código se convierte entonces en

 
var allItems = new DomainValueCollection(); 

en lugar de

 
var allItems = new KeyValue<DateTime, Dictionary<string, float>>(); 
+0

No estoy seguro de que funcione; ver mi segunda publicación de por qué (era demasiado largo para encajar en un comentario sensatamente) –

3

@Adam - No se puede declarar una clase aquí, ya que no será lo que regresa de una IDictionary<,>.GetEnumerator() - Sin embargo, puede alias vía using:

using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime, 
    System.Collections.Generic.Dictionary<string, float>>; 

continuación:

Esto es solo un alias tipo, por lo que funciona bien.

+0

¿QUÉ? ¿Por qué hacer todo eso cuando simplemente puedes "var" ...? ¿No entiendo? –

+2

@Bobby para que coincida con los requisitos de la pregunta ... –

2

puede ser muy tarde, pero escribió un Visual Studio 2015 extensión que lo hace basado en la plataforma .NET compilador. Replace var with Type Se prueba para escenarios normales y si hay un error, lo arreglaré lo antes posible y también es de código abierto en caso de que alguien quiera contribuir o mejorar esta herramienta.

8

Esto es posible en Visual Studio 2017.

Herramientas> Opciones> Editor de texto> C#> Código del estilo> General -

Encuentra las preferencias de los var '> Cuando el tipo de variable es evidente. Para Preferencia, seleccione "Prefiero el tipo explícito" y, para Severity, seleccione "Sugerencia".

enter image description here

Ahora vamos a obtener las acciones de la bombilla cuando se utiliza var, y puede cambiar rápidamente con el tipo explícitos mediante el uso de la Ctrl. tecla de acceso directo.

enter image description here

enter image description here

+0

De alguna manera, esto no funciona para mí después de cambiar la configuración sugerida? La única opción que tengo en la bombilla es 'Método de extracción'? Estoy usando Visual Studio 2017 CE ... ¿Hay alguna otra opción necesaria para que esto funcione? –

+1

No estoy seguro acerca de Community Edition, pero no esperaría que sea diferente. Intente configurar la gravedad como advertencia o excepción y vea si se muestra en su lista de errores. Tal vez también intente reiniciar VS? – HaveSpacesuit

+0

Cambiar la gravedad de advertencia o error funciona, ¡gracias por la sugerencia! –

Cuestiones relacionadas