Qual é o objective da palavra-chave var?

A palavra-chave var elimina a necessidade de uma declaração de tipo explícita e li com interesse a discussão de SO sobre quando ela pode ser apropriada.

Eu também li sobre (mas não usei) Boo que parece levar as coisas um passo adiante, tornando opcional declarar uma variável local . Com Boo, tanto o tipo quanto a declaração podem estar implícitos.

O que me leva a pensar, por que os designers de linguagem C # se preocuparam em include uma palavra-chave var?

Atualização : Sim, o var suporta tipos anônimos, mas os tipos anônimos por si só não exigem a palavra-chave var …

var anon = new { Name = "Terry", Age = 34 }; 

versus

 anon = new { Name = "Terry", Age = 34 }; 

Atualização: Existem duas questões relacionadas aqui, na verdade: 1. Por que eu tenho que declarar variables? 2. Que uso é “var” em uma linguagem que faz você declarar variables?

As respostas para (1) são numerosas e podem ser encontradas em outro lugar para essa questão. Minha resposta para (2) é abaixo:

Como outros comentaristas disseram, o LINQ usa isso para seus tipos anônimos. No entanto, o LINQ é, na verdade, uma instância de um problema mais geral, em que o tipo do lado direito de uma expressão é desconhecido do programador ou extremamente detalhado. Considerar:

 SomeGeneric> thing = new SomeGeneric>(); 

Verbose e propenso a erros, certo? Então agora eles permitem que você faça isso:

 var thing = new SomeGeneric>(); 

Ao reduzir a duplicação de informações, os erros são eliminados. Note que não há apenas erros de digitação, aqui: é possível que o tipo da expressão da esquerda seja typescript incorretamente de tal forma que o compilador possa ser convertido silenciosamente da esquerda para a direita, mas a conversão realmente perde alguma propriedade da rvalue. Isso é ainda mais importante quando os tipos retornados pelo rvalor podem ser desconhecidos ou anônimos.

Sem a palavra-chave var, é possível criar acidentalmente uma nova variável quando você pretendia usar uma variável já existente. por exemplo

 name = "fred"; ... Name = "barney"; // whoops! we meant to reuse name 

Eu entendo a necessidade de var e isso serve muito bem. Não ter nenhuma palavra-chave e apenas definir variables ​​rapidamente sem nenhum tipo é assustador. Você está machucando o próximo cara que tem que manter seu código ou a si mesmo, se você precisar refazer o código que você não tocou em mais de um ano. Eu não tenho certeza que é uma porta que deve ser aberta em C # e espero que não seja como var já está causando problemas de legibilidade quando está sendo usado quando não é necessário.

Quase todo exemplo do .net 3.5 que estou vendo ultimamente tem todas as variables ​​definidas com var.

O argumento que eu faço é que ele realmente sacrifica a legibilidade para salvar as teclas digitadas quando é mais usado. Por exemplo:

 // What myVar is, is obvious SomeObject myVar = new SomeObject(); // What myVar is, is obvious here as well var myVar = new SomeObject(); 

O problema que vejo é que as pessoas estão usando em todos os lugares … por exemplo:

 // WTF is var without really knowing what GetData() returns? // Now the var shortcut is making me look somewhere else when this should // just be readable! var myVar = GetData(); // If the developer would have just done it explicitly it would actually // be easily readable. SomeObject myVar = GetData(); 

Assim, o próximo argumento será, basta nomear a function melhor …

 var weight = GetExactWeightOfTheBrownYakInKilograms(); 

Ainda não sei o que está voltando. É um int, decimal, float, object de peso, o que? Eu ainda tenho que perder tempo procurando … preciso da muleta intellisense para salvar o dia da minha programação preguiçosa. Talvez inclua o tipo de retorno no nome da function. Boa idéia, agora usando var não nos salvou nada, exceto fazer todas as minhas funções terem nomes longos reais.

Eu acho que as pessoas estão apenas usando var e isso está levando a uma programação preguiçosa que, por sua vez, leva a uma leitura mais difícil do código. Toda vez que você digita a palavra-chave var, você deve ter uma boa razão para usá-la em vez de ser explícita.

Isso é um pouco subjetivo, mas acho que projetar o C # 3.0 para ter a palavra-chave “var” para variables ​​digitadas implicitamente em vez de nenhuma palavra-chave torna o código mais legível. Por exemplo, o primeiro bloco de código abaixo é mais legível que o segundo:

Óbvio onde a variável é declarada:

 var myVariable = SomeCodeToSetVariableHere; myVariable = SomeOtherCodeTOSetVariable; 

Não é óbvio onde a variável é declarada:

 myVariable = SomeCodeToSetVariableHere; myVariable = SomeOtherCodeTOSetVariable; 

Estes são exemplos muito simplistas. Eu acho que você pode ver onde isso vai. Em situações complexas, pode ser bom encontrar o local onde uma variável é realmente definida.

Na sua pergunta, var adiciona valor ao código dizendo ao compilador que a palavra anon agora é legal para uso em qualquer lugar que você esperaria ver um item do tipo implícito na atribuição. Exigir a introdução de nomes para o compilador como este permite que o compilador rejeite coisas que não foram explicitamente informadas que são permitidas e, assim, capturam certos tipos de erros em tempo de compilation, para que não explodam em tempo de execução.

Por exemplo, na seção de atualização da sua pergunta, você perguntou sobre este snippet:

 anon = new { Name = "Terry", Age = 34 }; 

O problema em permitir isso é que ele transforma qualquer coisa no lado esquerdo de qualquer atribuição em que o nome não existia anteriormente em uma declaração de variável, mesmo que seja um erro de digitação. Se mais tarde no programa você atribuir algo a anon e, em seguida, ainda mais em referência ao novo valor, mas a instrução do meio tiver um erro de digitação, você terá um problema que não será exibido até o tempo de execução.

Sua resposta é que Boo faz isso, então deve estar tudo bem ou pelo menos possível. Mas isso é um arenque vermelho. Estamos falando de C #, não de Boo. Um dos propósitos do C # é ter uma linguagem onde o compilador possa capturar tantos erros quanto possível. Boo também quer fazer isso, mas também quer ser mais parecido com o Python. Então, ele sacrifica alguns (não todos) os resources de segurança em tempo de compilation do C # em troca de uma syntax similar a python.

disclaimer: meus exemplos são Java porque é isso que eu sei, mas os conceitos devem ser idênticos.

Eu votei a resposta que eu sinto é crítica (é muito fácil criar acidentalmente uma nova variável).

 bill=5; bi11=bill+5 

Qual é o valor da conta?

Dito isso, acho irritante às vezes digitar:

 DataOutputStream ds=new DataOutputStream(); 

Parece redundante, mas honestamente não há nada realmente errado com isso. Você não precisa mais digitá-lo duas vezes e é extremamente útil. O que leva tempo é quando você tem dúvidas – quando não tem certeza de como usar alguma API. Se realmente incomoda você digitar essa declaração de tipo duas vezes, então por que você está perdendo seu tempo aqui? Desde que você começou a ler isso, você poderia ter typescript 30 ou 40 declarações, o suficiente para cada declaração que você precisa para as próximas duas semanas.

Acho que estou dizendo que, embora eu entenda o estresse emocional que a repetição pode causar, a consistência, a clareza e a capacidade de criar ferramentas mais inteligentes valem a pena.

Mais uma coisa, a maior parte do tempo o código não deve ser como o meu exemplo acima. O que você deveria fazer é isto:

 DataOutput ds=new DataOutputStream(); 

Isso imediatamente esconde o fato de que você está usando uma class concreta em um modelo. Esse modelo deve ser capaz de fazer todas as operações necessárias na sua aula. Mais tarde, se você quiser replace o ds por outro tipo de stream de saída, basta alterar essa única linha para corrigi-lo. Se você estava usando os resources não disponíveis para DataOutput, convertendo para DataOutputStream, o editor irá facilmente descobrir e informá-lo.

Eu acredito que var (e várias outras novas palavras-chave) foram adicionadas especificamente para suportar o Linq.

var é a palavra-chave usada para criar um tipo anônimo – consulte http://msdn.microsoft.com/pt-br/library/bb397696.aspx

Tipos anônimos podem ser usados ​​em outros lugares além do Linq.

var é extremamente útil para o Linq. De fato, de acordo com um autor especialista, ” Sem ‘var’, o LINQ fica muito doloroso para ser usado ” .

Para tipos anônimos, que, entre outras coisas, suportam o LINQ.

http://www.blackwasp.co.uk/CSharpAnonTypes.aspx

Intereting Posts