Por que o ReSharper deseja usar 'var' para tudo?

214

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.

Chris
fonte
27
Estou pensando nisso há um tempo e cheguei à conclusão de que sempre devo usar 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;).
MasterMastic 30/01

Respostas:

189

Um dos motivos é a legibilidade aprimorada. Qual é melhor?

Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();

ou

var dictionary = new Dictionary<int, MyLongNamedObject>();
Mark Sherretta
fonte
260
Eu diria o primeiro. Mais fácil de ver o que está acontecendo!
Mongus Pong 9/12/2009
104
Fungo: Você gosta Você gosta de texto redundante texto redundante? : D
Mark Simpson
73
Ser explícito é mais claro na minha opinião. Usar var para criar muita dor de cabeça em alguns cenários.
precisa saber é o seguinte
172
Eu odeio quando os desenvolvedores usam varpara 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 seja var items = GetSomeItems();vs IDataReader dr = GetSomeItems();Faltando instrução usando ambos, mas mais fácil para mim pegar quando usando IDataReadervs var.
Chris Gessler
17
se você é um bom desenvolvedor escrevendo um bom código e está usando uma biblioteca como o Resharper, não precisa saber o tipo explícito com o qual está lidando. Assim como quando você usa interfaces para declarar um contrato, mas não uma classe concreta, var permite que você diga que não se importa com o "tipo" de retorno, mas sim com o que ele faz e usando variáveis ​​bem nomeadas, com os ajudantes intelli-sense e resharper / VS (como CTRL + CLICK para navegar para a definição), você terá 99% do caminho até lá. Além disso, usar var significa que não preciso reescrever minha base de código se eu alterar um tipo de retorno de método.
9788 Joshua Barker #
286

O que o ReSharper sugere é claramente o uso excessivo da palavra-chave var. Você pode usá-lo onde o tipo é óbvio:

var obj = new SomeObject();

Se o tipo não for óbvio, você deve escrever:

SomeObject obj = DB.SomeClass.GetObject(42);
Guffa
fonte
36
Para interpretar o advogado do diabo, talvez se o tipo não estiver claro no método ou no nome da variável, isso indica um problema em nomear mais do que um uso excessivo de var. Eu concordo em princípio, porém, var só deve ser usado quando não está removendo a clareza.
Matt Briggs
33
Nesse caso, prefiro usar nomes de variáveis ​​melhores. Você está basicamente propondo que procuremos para ver onde a variável é definida para descobrir o tipo - proponho que nomeemos as variáveis ​​melhor para que possamos conhecer o propósito da variável de antemão.
Jaco Pretorius
18
@Jaco: +1, mas vale a pena mencionar que não é recomendável que as informações sobre o tipo estejam no nome de uma variável. Por exemplo, a notação húngara não é considerada uma boa prática.
Roman Boiko
8
Se as configurações padrão do ReSharper são um uso excessivo 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.
Joel Mueller
15
@AnonymousType: Você ainda está perdendo o ponto. Você disse que os nomes dos métodos sempre devem refletir a intenção do método, mas mesmo se o fizerem, isso não significa que o nome especifique o tipo do valor de retorno. O método para leitura de um Streamobjeto, por exemplo, é nomeado Read, não ReadAndReturnNumberOfBytesAsInt32.
Guffa
99

Pessoalmente, prefiro desativar essa sugestão. O uso vargeralmente 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 vare quando não uso. Mas, novamente, sou apenas eu.

Bryan Menard
fonte
11
Eu pensei que ReSharper era para ser bastante inteligente; Não deveria ser inteligente o suficiente para saber quando o tipo resultante é óbvio (por exemplo, algo com a nova palavra-chave) e quando não é óbvio?
usar o seguinte
3
Bem, não conheço as peculiaridades do recurso, mas com certeza sei que fiquei impressionado com a quantidade de sugestões que ele deu; E eu uso varbastante frequentemente também.
9609 Bryan Menard
5
Descobri que quando você sempre usa var (como sugerido pelo resharper), isso força você a nomear suas variáveis ​​corretamente.
Sauleil 28/01
Você pode desativar a sugestão?
21713 Chris S
@AngeDeLaMort: o ponto é que obriga a usar nomes impróprios, fe var methodXYResultIntArray. Isso é contra todos os padrões de codificação e menos conciso que int[] methodXYResult. Se você quiser retornar um byte[]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 usar var, por exemplo, com a Dictionary<string, List<SomeType<int>>>. Mas se o nome completo do tipo não for muito longo e você não o usar newno lado direito (ou no elenco explícito), o compartilhador não deve sugerir.
precisa saber é o seguinte
69

varpode 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 varestá 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 à vardiminuição da compreensão do código. varPorém, isso não é culpa de:

var value1 = GetNotObviousValue(); //What's the data type? 
//vs. 
var value2 = Math.Abs(-3); // Obviously a numeric data type. 

Às vezes, não faz sentido usar vartipos de dados simples quando o código é mais legível na sua ausência:

var num = GetNumber(); // But what type of number?
// vs. 
double num = GetNumber(); // I see, it's a double type. 

Às vezes, varpode ser útil ocultar informações de tipo de dados das quais você não se importa necessariamente em ver as complexidades de:

    IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG! 
    //vs. 
    var q = from t in d where t.Key == null select t;

    // I simply want the first string, so the last version seems fine.  
    q.First().Key; 

Você deve usar varquando houver um tipo anônimo presente, porque não há um nome de tipo para chamá-lo:

var o = new { Num=3, Name="" };

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 varnã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.

John K
fonte
5
IMHO seus exemplos são realmente boas razões para usar 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étodo GetNumberAsDouble(), então é igualmente claro e funcionará se você tiver um método retornando stringe outro retornando double.
precisa
10
@ nicodemus13 Geralmente, você sabe quando se importa com o tipo de retorno de uma função quando realmente usa o valor de retorno, e não quando está escrevendo a própria função. Seu esquema de nomeação sugerido pode levar a abusos, como GetResultsAsIEnumerableOfDouble, e tudo o que faz é mudar as informações de tipo que você removeu do lado esquerdo de uma atribuição, usando var no lado direito do atributo.
Eric
var valor2 = Math.Abs ​​(-3); // Obviamente, um tipo de dados numérico. Desculpe eu discordo sobre este, completamente, uma vez que o método Abs tem 7 sobrecargas que não leva a nada, mas obscuridade quando olhar para ele, imo
s1cart3r
var também pode levar a erros lógicos sutis como: var counter = "0"; quando o que você quer é um número inteiro.
Alaniane
42

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:

Menu Opções ReSharper

Então, em "Inspeção de código", ajustando a "Severidade da inspeção" do idioma escolhido, no meu caso c #:

Desativar sugestão de variável local digitada implicitamente

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 :)

Erikest
fonte
Isso responde a uma pergunta diferente que não foi feita.
Carles Alcolea
9
Mas é relevante para muitos que a procuram quando chegam aqui. 1
Ori Nachum
24

Surpreende-me que ninguém tenha mencionado que também é mais fácil alterar o tipo do objeto instanciado, porque

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

é uma forma de repetição . Se eu quiser mudar AVeryLongTypeNamepara uma de suas classes derivadas, preciso mudar isso apenas uma vez ao usar vare 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.

Philipp
fonte
Muito útil ao chamar métodos de fábrica em vez de "novo"
Ian Ringrose
Se você precisar usar 'MyClass' quando escrever o código e ele funcionar, ele funcionará. Quando você precisar alterá-lo, precisará alterá-lo para qualquer lugar, especialmente quando tiver interfaces envolvidas. O código não deve ser tratado como um ensaio, deve ser semântico e bem definido.
Piotr Kula
24

'var' é sobre ser claro

O principal debate sobre o uso varou 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.

Jake disse olá para Bill. Ele não gostou dele, então ele se virou e foi para o outro lado.

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 varpalavra - chave. Nesse caso, pode ser mais específico. O exemplo a seguir é muito mais claro.

Jake disse olá para Bill. Jake não gostava de Bill, então ele se virou e foi para o outro lado.

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.

Bill gosta de livros, então Bill foi à biblioteca e Bill pegou um livro que Bill sempre gostou.

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 varpalavra - chave.

Bill gosta de livros, então ele foi à biblioteca e pegou um livro que ele sempre gostou.

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:

Person p = GetPerson();

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 psignifica neste caso:

var p = GetPerson();

Que tal agora:

var p = Get();

Ou agora:

var person = Get();

Ou este:

var t = GetPerson();

Ou isto:

var u = Person.Get();

Se a palavra-chave varfunciona 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 varpalavra-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.

Luis Perez
fonte
1
Gosto mais desta resposta, porque não tenho nada contra 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. 1
Piotr Kula
Em todos os seus casos em que o tipo retornado não é evidente, concordo que você não deve usar var, pois agora está omitindo informações úteis.
rola
18

Eu 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

LiamB
fonte
13
Depois de mais ou menos um ano resistindo, eu quase sempre uso var agora.
LiamB
15

Eu vejo muitas respostas corretas, mas faltando a completa.

É verdade que o ReSharper faz uso excessivo varpor padrão. Eu acho que a maioria das pessoas concorda com isso. Também é mais fácil ler quando varé usado e o tipo é óbvio, como quando você usa uma newinstrução. Vi um post que mostrava como atualizar a gravidade da inspeção para mostrar apenas dicas para o uso de var.

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

  • Para tipos internos Use tipo explícito
  • Para tipos simples Use 'var' quando evidente
  • Em outros lugares Use'var '

insira a descrição da imagem aqui

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'

Nathan Kovac
fonte
Este deve ser marcado como fora resposta correta de debates var, esta é a abordagem equilibrada
Brian Ogden
Você poderia dar um exemplo de como "onde evidente" é decidido?
rola
13

Minha regra é esta:

  • Você está declarando um tipo primitivo (ie byte, char, string, int[], double?, decimal, etc.)? -> Use o tipo:

    string myStr = "foo";
    int[] myIntArray = [123, 456, 789];
    double? myDouble = 123.3;
  • Você está declarando um tipo complexo (ou seja List<T>, Dictionary<T, T>, MyObj)? -> Uso var:

    var myList = List<string>();
    var myDictionary = Dictionary<string, string>();
    var myObjInstance = new MyObj();
Sumner Evans
fonte
Eu gostaria de discordar, 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.
Dean Meehan
12

Gostaria apenas de salientar que o uso de "var" é recomendado nas Convenções de codificação C #

quando o tipo da variável é óbvio do lado direito da atribuição ou quando o tipo preciso não é importante

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.

Jose
fonte
Isso é ótimo quando você sabe que o tipo é originário 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.
Piotr Kula
"Recomendado quando o tipo da variável é óbvio" e "Eles também fornecem alguns casos em que isso não melhoraria a legibilidade logo abaixo no mesmo documento". Honestamente, acho que perdi o seu ponto. Minha resposta diz a mesma coisa que você diz.
Jose
6

O ReSharper recomenda varporque tende a desorganizar a criação do objeto.

Compare estes dois exemplos:

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

É 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.

Paul Sasik
fonte
6

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 varpalavra-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 varsugestão, para que sejam menos proeminentes, ou atualizar o alerta 'usar método de extensão' para que apareça como um erro real.

Tim Robinson
fonte
5

O varrecurso 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.

Klaus Byskov Pedersen
fonte
4

Var é incrível! Já deparei com muitos desenvolvedores que têm a impressão de que varestã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 varbrilho. Como varé 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:

for(var i = 0; i < 10; i++) 
{

}

vs

for(int i = 0; i < 10; i++) 
{

}

Tudo vardepende da preferência pessoal, mas o uso realmente acelerará o seu desenvolvimento e desbloqueará um mundo inteiro de bens do tipo anônimo.

KnowHoper
fonte
2

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:

var x = 1;

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:

var x = 1; --> var x = "hello";
int x = 1; --> string x = "hello";
eWolf
fonte
1
@AlexKamburov, o código 10 linhas abaixo será quebrado mesmo assim, não está relacionado à var.
user3285954
1
@ user3285954 Em alguns casos, o var pode ocultar o problema e é aí que as coisas podem ficar feias. O problema não está na escrita do código, o problema está na manutenção. Alguns argumentam que é mais limpo com var, mas às vezes vejo isso como ofuscação. É perto de um debate religioso. brad-smith.info/blog/archives/336 Eu pessoalmente uso var apenas para instruções Linq e outros lugares onde declarar o tipo é realmente detalhado. Eu acho que var é uma boa adição e as pessoas precisam assistir aos comentários de Anders Hejlsberg sobre as razões para introduzi-lo.
Alex Kamburov
2

A varpalavra-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:

var myInt = 23;

retorna um inttipo, enquanto

var myInt = "23";

retorna um stringtipo.

Referência MSDN

Daniel May
fonte
2

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:

Animal x = new Dog();
DoStuffWithDog(x as Dog);

x = new Cat();
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

O mesmo código, com x declarado com 'var' , não será compilado .

var x = new Dog(); // from this point, x is a Dog
DoStuffWithDog(x as Dog);

x = new Cat(); // cannot assign a Cat instance to a Dog
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

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'. :-)

xtrem
fonte
4
A fundição desnecessária (com as) é totalmente horrível. Você transforma erros de compilação em erros de tempo de execução se tiver algo como Animal 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.
precisa saber é o seguinte
a transmissão (com 'como' ou não) pode resultar em um erro de tempo de execução. O que há de tão horrível no elenco quando você sabe o que está fazendo? Por que reutilizar x? O exemplo aqui é ilustrativo. O objetivo do exemplo é mostrar como o uso de 'var' pode resultar em limitações quando uma referência é polimórfica.
Xtrem
5
Não, não pode: o polimorfismo é o oposto do que está acontecendo aqui. Isso está tentando passar objetos do tipo Animalpara métodos que usam Doge Cat. Polimorfismo é o inverso: para que você pode passar objetos do tipo Doge Catem um método que leva Animal, por exemplo void Walk(Animal a): Walk(new Cat()),Walk(new Dog())
Mark Sowul
Você não deve reutilizar variáveis ​​dessa maneira, leva a erros muito desagradáveis. Não é tão óbvio em métodos curtos, mas quando você tem de 15 a 20 linhas de código, você esquecerá o que é x. Não seja preguiçoso: var dog = new Dog (); DoStuff (cachorro); var cat = novo gato (); DoStuff (gato);
precisa saber é o seguinte
2
Sem brigas. Não tenho sentimentos pelas duas formas de declarar variáveis ​​(implícitas ou explícitas). Na verdade, eu uso pelo menos um de cada dia. Estou apenas destacando que, quando você escolhe o método implícito (var), o compilador decide o tipo mais restrito possível para você. O que nem sempre pode ser o que você deseja. Isso é tudo.
Xtrem 10/04
2

Na minha opinião, varsó deve ser usado quando for imediatamente claro qual é o tipo ao definir o valor da variável.

Exemplo:

var s = "string value";

É óbvio que sé um string.

Eu acredito que também é apropriado quando o nome do tipo de variável é muito complexo.

Exemplo:

Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

// This is a little easier to read than the above statement
var dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

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:

// returns some file writer
var wr = GetWriter();

wr.add("stuff");
wr.add("more stuff");

//...
//...

// Now `wr` needs to be disposed, 
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.
James Wierzba
fonte
1

'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:

var bar = GetTheObjectFromDatabase();
bar.DoSomething();

ClassA {
  void DoSomething() {
  //does something
  }
}

ClassB {
  void DoSomething() {
  //does something entirely different
  }
}

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:

var abc = new Something();
lolaldanee
fonte
1

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

insira a descrição da imagem aqui

Derek
fonte
0

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.

Jaco Pretorius
fonte
0

De acordo com JetBrains (o autor do ReSharper), eles incentivam o uso de var por padrão.

No site deles :

O uso de variáveis ​​locais de tipo implícito (também conhecidas como varpalavra-chave) introduzidas no C # 3.0 tornou-se bastante popular, pois melhora a legibilidade em muitos cenários. Por padrão, o ReSharper também incentiva o uso de varpalavras-chave, mas as preferências de seu uso são configuráveis ​​de forma flexível - por exemplo, você pode optar por usar tipos explícitos em casos específicos ou em qualquer lugar, e o ReSharper ajudará a reforçar suas preferências.

Jeff Reddy
fonte
Onde posso configurar quando exigir declaração de tipo explícita?
user764754