Acabei de começar a usar o ReSharper com o Visual Studio (depois das muitas recomendações sobre SO). Para testar, abri um projeto recente do ASP.NET MVC. Uma das primeiras e mais frequentes coisas que notei sugerir é mudar a maioria / todas as minhas declarações explícitas para var
. Por exemplo:
//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
e assim por diante, mesmo com tipos simples, como int
, bool
, etc.
Por que isso está sendo recomendado? Eu não sou formado em ciência da computação ou .NET, tendo "caído" no desenvolvimento .NET recentemente, então eu realmente gostaria de entender o que está acontecendo e se é ou não benéfico.
var
, mesmo quando o tipo não é óbvio! o motivo é porque me obriga a escolher o nome mais descritivo que eu possa inventar e, finalmente, isso torna o código muito, muito mais legível. Por fim, também ajuda a separar a lógica da implementação. Claro que é apenas a minha opinião, espero que ajude alguém;).Respostas:
Um dos motivos é a legibilidade aprimorada. Qual é melhor?
ou
fonte
var
para tudo - eu faço lotes e lotes de revisões de código usando TFS (diffs baseadas na web) e faz meu trabalho extremamente difícil: ou sejavar items = GetSomeItems();
vsIDataReader dr = GetSomeItems();
Faltando instrução usando ambos, mas mais fácil para mim pegar quando usandoIDataReader
vsvar
.O que o ReSharper sugere é claramente o uso excessivo da palavra-chave var. Você pode usá-lo onde o tipo é óbvio:
Se o tipo não for óbvio, você deve escrever:
fonte
var
é uma questão de opinião, e não "claramente" uma coisa ou outra. Prefiro não digitar coisas que o compilador possa descobrir por si mesmo. Eu gosto de inferência do tipo C # e geralmente desejo que seja tão boa quanto a inferência do tipo F #. Se eu pudesse, deixaria de fora tipos explícitos dos parâmetros do método e tipos de retorno, como é a norma em F #. Nem todo mundo concorda, é claro.Stream
objeto, por exemplo, é nomeadoRead
, nãoReadAndReturnNumberOfBytesAsInt32
.Pessoalmente, prefiro desativar essa sugestão. O uso
var
geralmente pode melhorar a legibilidade; mas, como você mencionou, algumas vezes o reduz (com tipos simples ou quando o tipo resultante é obscuro ).Prefiro escolher quando uso
var
e quando não uso. Mas, novamente, sou apenas eu.fonte
var
bastante frequentemente também.var methodXYResultIntArray
. Isso é contra todos os padrões de codificação e menos conciso queint[] methodXYResult
. Se você quiser retornar umbyte[]
do método no futuro, todos os seus nomes de variáveis estão incorretos. Com tipos explícitos, você pode refatorar isso com muita facilidade. Existem razões para usarvar
, por exemplo, com aDictionary<string, List<SomeType<int>>>
. Mas se o nome completo do tipo não for muito longo e você não o usarnew
no lado direito (ou no elenco explícito), o compartilhador não deve sugerir.var
pode aumentar a legibilidade do código enquanto diminui a compreensão imediata do código. Da mesma forma, pode diminuir a legibilidade do código para outras situações. Às vezes, o uso é neutro. A medida da legibilidade para a compreensão não é proporcional, mas depende da situação. Às vezes, ambos aumentam ou diminuem juntos.O fator é o que
var
está sendo aplicado e quão bem o destino suporta a ofuscação imediata de seu tipo de dados para o leitor, ou se suas informações de tipo são necessárias para compreender a parte do programa em questão.Por exemplo, a nomeação incorreta pode levar à
var
diminuição da compreensão do código.var
Porém, isso não é culpa de:Às vezes, não faz sentido usar
var
tipos de dados simples quando o código é mais legível na sua ausência:Às vezes,
var
pode ser útil ocultar informações de tipo de dados das quais você não se importa necessariamente em ver as complexidades de:Você deve usar
var
quando houver um tipo anônimo presente, porque não há um nome de tipo para chamá-lo:Apesar de o Visual Studio Intellisense fornecer informações de tipo
var
, você precisa confiar menos no seu entendimento por meio da leitura estrita de código sem ajuda. Provavelmente, é aconselhável supor que nem todos podem ter ou usar o Intellisense.Em resumo, com base nos exemplos acima, sugiro que a aplicação de carta branca
var
não seja uma boa idéia, porque a maioria das coisas é melhor feita com moderação e com base nas circunstâncias em questão, como mostrado aqui.Por que o Resharper usa tudo por padrão? Eu sugeriria com facilidade, porque não é possível analisar as nuances das situações para decidir quando é melhor não usá-las.
fonte
var
, forçará você a escrever nomes de métodos decentes.GetNumber() -but what type?
- bem, por que você se importa? Se é importante saber disso, chame o métodoGetNumberAsDouble()
, então é igualmente claro e funcionará se você tiver um método retornandostring
e outro retornandodouble
.No ReSharper (8.02, mas provavelmente em outras versões), a opção da sugestão "Usar declaração de variável local digitada implicitamente" pode ser ajustada conforme sua preferência , seja o que for, abrindo primeiro o menu de opções do ReSharper:
Então, em "Inspeção de código", ajustando a "Severidade da inspeção" do idioma escolhido, no meu caso c #:
Como você pode ver, existem opções para ajustar todas as sugestões que o ReSharper faz. Espero que isso ajude alguém como eu, que já tem uma estratégia de uso 'var' e só quer que o ReSharper a respeite :)
fonte
Surpreende-me que ninguém tenha mencionado que também é mais fácil alterar o tipo do objeto instanciado, porque
é uma forma de repetição . Se eu quiser mudar
AVeryLongTypeName
para uma de suas classes derivadas, preciso mudar isso apenas uma vez ao usarvar
e ainda pode acessar os métodos das classes filho.Além disso, a legibilidade aprimorada é um ponto importante, mas como outros disseram, o var não deve ser usado em excesso, por isso acho que desligar a dica no Resharper é absolutamente aceitável.
fonte
'var' é sobre ser claro
O principal debate sobre o uso
var
ou não da palavra - chave é sobre a legibilidade do código para você e outros desenvolvedores.Como se você estivesse escrevendo uma história, não há resposta certa definitiva. Mas vamos ver alguns exemplos disso em inglês simples.
Quem foi para o outro lado? Jake ou Bill? Nesse caso, usar os nomes "Jake" e "Bill" é como usar o nome do tipo. E "Ele" e "ele" é como usar a
var
palavra - chave. Nesse caso, pode ser mais específico. O exemplo a seguir é muito mais claro.Nesse caso, ser mais específico tornou a frase mais clara. Mas isso nem sempre será o caso. Em alguns casos, ser específico torna mais difícil a leitura.
Nesse caso, seria mais fácil ler a frase se usássemos "he" e, em alguns casos, deixássemos seu nome todo junto, o que equivale a usar a
var
palavra - chave.Esses exemplos cobrem a essência, mas não contam a história toda. Nesses exemplos, havia apenas uma maneira de se referir à pessoa. Ou usando seu nome ou usando um termo mais geral como "ele" e "ele".
No caso do código, temos três maneiras de ajudar a adicionar clareza. O tipo, o nome da variável e a atribuição. Pegue esta linha de código, por exemplo:
A questão agora é: existem informações suficientes nessa linha de código para ajudá-lo a descobrir o que está acontecendo?
E a seguinte linha de código? Você ainda saberia o que
p
significa neste caso:Que tal agora:
Ou agora:
Ou este:
Ou isto:
Se a palavra-chave
var
funciona em um determinado cenário depende muito do contexto do código, como o nome das variáveis, classes e métodos. Também depende da complexidade do código e do restante do código ao seu redor.Pessoalmente, gosto de usar a
var
palavra-chave que é mais abrangente para mim na maioria das vezes. Mas também tendem a nomear minhas variáveis após o tipo, para não perder realmente nenhuma informação.Dito isto, às vezes, dependendo do contexto em que faço exceções, essa é a natureza de qualquer coisa complexa e o software não é nada senão complexo.
fonte
var
, desde que saiba o que é enquanto lê essa linha. Se eu não tiver ideia do retorno de um método de outra Solução usando um modelo de domínio diferente, prefiro esse tipo explicitamente definido, facilitando a leitura. 1Eu não gostei disso também.
Eu não quero que isso se transforme em um debate sobre o uso de
var
, tem seus usos, mas não deve ser usado em qualquer lugar.O importante a lembrar é que o ReSharper está configurado para os padrões de codificação que você deseja.
Edit: ReSharper e var
fonte
Eu vejo muitas respostas corretas, mas faltando a completa.
É verdade que o ReSharper faz uso excessivo
var
por padrão. Eu acho que a maioria das pessoas concorda com isso. Também é mais fácil ler quandovar
é usado e o tipo é óbvio, como quando você usa umanew
instrução. Vi um post que mostrava como atualizar a gravidade da inspeção para mostrar apenas dicas para o uso devar
.Eu tentei comentar em outras postagens primeiro para adicionar onde colocá-las, mas não tinha reputação. Aparentemente, eu também não tinha reputação de postar minha captura de tela das configurações.
Vou explicar como chegar lá.
No Visual Studio> Menu Principal> Recarregador> Opções> Edição de Código> C #> Estilo de Código> Uso de Var nas declarações
Documentação de ajuda do ReSharper: Estilo da sintaxe do código: digitação implícita / explícita (palavra-chave 'var') - Configure as preferências do uso da palavra-chave 'var'
fonte
Minha regra é esta:
Você está declarando um tipo primitivo (ie
byte
,char
,string
,int[]
,double?
,decimal
, etc.)? -> Use o tipo:Você está declarando um tipo complexo (ou seja
List<T>
,Dictionary<T, T>
,MyObj
)? -> Usovar
:fonte
string myStr = "foo";
é óbvio que é uma corda. Eu colocaria todos os seus exemplos no uso da categoria var ... e nas declarações retornadas de um método para usar o tipo de explicidade. Mas, no final das contas, é o que você e sua equipe sentem melhor para o projeto em particular.Gostaria apenas de salientar que o uso de "var" é recomendado nas Convenções de codificação C #
provavelmente é por isso que a dica está ativada por padrão no ReSharper. Eles também fornecem alguns casos em que isso não melhoraria a legibilidade logo abaixo no mesmo documento.
fonte
System.Diagnostics.PerformanceCounter()
- você pode facilmente dizer que é o contador de desempenho da classe de diagnóstico incorporada. Mas que tipo é retornado aqui?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)
? Nenhuma pista, especialmente se você tiver mais de 100 projetos em sua solução.O ReSharper recomenda
var
porque tende a desorganizar a criação do objeto.Compare estes dois exemplos:
É apenas uma abreviação que deveria ser mais fácil de ler.
Eu acho que é bom quando você cria novos objetos explicitamente com "new". No seu exemplo, no entanto, pode não ser óbvio se as classes não foram nomeadas corretamente.
fonte
BTW, o ReSharper faz uma distinção entre 'você pode aplicar esta sugestão ao seu código' e 'seu código está quebrado, quer que eu conserte?'. A
var
palavra-chave está na categoria de sugestão, junto com itens como "inverter se reduzir o aninhamento"; você não precisa segui-lo.Você pode configurar o quão irritante cada um de seus alertas é através da caixa de diálogo Opções ou diretamente através do menu pop-up desse alerta. Você pode fazer o downgrade de coisas como a
var
sugestão, para que sejam menos proeminentes, ou atualizar o alerta 'usar método de extensão' para que apareça como um erro real.fonte
O
var
recurso do .Net 3.0 é apenas uma inferência de tipo , que é do tipo seguro e geralmente facilita a leitura do seu código. Mas você não precisa fazê-lo e pode desativar essa recomendação novamente, se desejar.fonte
Var é incrível! Já deparei com muitos desenvolvedores que têm a impressão de que
var
estão vinculados a um tipo dinâmico, não estão. Ele ainda é digitado estaticamente, é apenas decidido pelo compilador.Aqui estão alguns pontos positivos surpreendentes do uso de var
Menos var de digitação é mais curto e fácil de ler, por exemplo,
Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()
Yuk.var postcodes = new Dictionary<int,IList<string>>()
\ o / \ o /Nomes de variáveis mais descritivos - um tênue, mas acho importante deixar aqui a natureza fluida do
var
brilho. Comovar
é um pouco vago, ele realmente incentiva um nome de variável mais descritivo, em vez de deixar o tipo falar por si.Menos alterações de código - se o tipo de retorno de uma chamada de método for alterado. Você só precisa alterar a chamada do método, nem todos os lugares em que é usada.
Tipos anônimos - tipos anônimos são um conceito realmente poderoso, especialmente em áreas como recursos parciais da WebApi . Sem var, eles não podem ser usados.
Às vezes, porém, é útil declarar explicitamente tipos e acho isso mais útil em primitivas ou estruturas. Por exemplo, eu pessoalmente não acho essa sintaxe muito útil:
vs
Tudo
var
depende da preferência pessoal, mas o uso realmente acelerará o seu desenvolvimento e desbloqueará um mundo inteiro de bens do tipo anônimo.fonte
Não há diferença técnica, se você usar var, o tipo é implícito pelo compilador. Se você tem um código como este:
x está implícito como int e nenhum outro valor pode ser atribuído a ele.
A palavra-chave var é útil se você alterar o tipo da variável; você só precisa fazer uma alteração em vez de duas:
fonte
A
var
palavra-chave foi introduzida no C # 3.0 - permite esquecer a especificação explícita do nosso tipo.Não há diferença real se você usa
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
ou
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
exceto pura legibilidade e menos chance de erro.
Parece um exemplo clichê, mas digamos que o seguinte possa ajudar sua compreensão:
retorna um
int
tipo, enquantoretorna um
string
tipo.Referência MSDN
fonte
A especificação de um tipo de objeto explícito é de alguma forma redundante. Mesmo traduzido em inglês, parece redundante: "coloque um objeto do tipo X em uma variável do tipo X" vs "Coloque um objeto do tipo X em uma variável".
No entanto, o uso de 'var' tem suas limitações . Impede o uso abaixo do polimorfismo, que é pura beleza :
Suponha que um cão estenda Animal; Cat estende a hierarquia de classes Animal:
O mesmo código, com x declarado com 'var' , não será compilado .
De qualquer forma, voltando à pergunta original, eu não uso o Resharper, mas presumo que seja inteligente o suficiente para detectar quando não usar 'var'. :-)
fonte
as
) é totalmente horrível. Você transforma erros de compilação em erros de tempo de execução se tiver algo comoAnimal x = new Cat(); DoStuffWithDog(x as Dog);
Por que reutilizar x? Cão x = novo Cachorro (), Gato y = novo Gato (), não gera mais ambiguidade possível.Animal
para métodos que usamDog
eCat
. Polimorfismo é o inverso: para que você pode passar objetos do tipoDog
eCat
em um método que levaAnimal
, por exemplovoid Walk(Animal a)
:Walk(new Cat())
,Walk(new Dog())
Na minha opinião,
var
só deve ser usado quando for imediatamente claro qual é o tipo ao definir o valor da variável.Exemplo:
É óbvio que
s
é umstring
.Eu acredito que também é apropriado quando o nome do tipo de variável é muito complexo.
Exemplo:
Além desses cenários, não vejo nenhum GANHO a ser feito usando
var
, mas consigo pensar em alguns cenários nos quais isso pode ser prejudicial:Por exemplo, um tipo descartável cujo valor da variável do lado direito não mostra claramente o tipo. A eliminação do IDisposable pode ser facilmente esquecida
Exemplo:
fonte
'var' adiciona um tipo de elemento "dinâmico" ao seu código (embora o código permaneça, é claro, estritamente digitado). Eu aconselho a não usá-lo nos casos em que o tipo não é claro. Considere este exemplo:
Caso o tipo de retorno GetTheObjectFromDatabase () seja alterado do tipo A para B, não perceberemos, pois ambas as classes implementam DoSomething (). O código, no entanto, agora pode realmente fazer algo completamente diferente.
Isso pode ser tão sutil quanto escrever coisas diferentes em um log, portanto você pode não perceber que é tarde demais.
O seguinte uso de var deve sempre ser bom:
fonte
Para aqueles que não gostam do uso constante de "var", também é possível parar o ReSharper de usar o padrão para var ao fazer "introduzir variável". Isso foi algo que me frustrou por um longo tempo, sempre foi padrão para var, e eu estava mudando o tempo todo.
Essas configurações estão em Edição de código> C #> Estilo de código
fonte
Não há diferença técnica (como o eWolf apontou). Você pode usar um ou outro, o código CLR gerado terá a mesma aparência.
Na minha opinião, o principal benefício é que isso tende a forçá-lo a usar uma melhor nomeação de variáveis. No seu exemplo, 'foo' é uma péssima escolha para um nome de variável.
fonte
De acordo com JetBrains (o autor do ReSharper), eles incentivam o uso de var por padrão.
No site deles :
fonte