Pergunta

O var palavra-chave elimina a necessidade de uma declaração de tipo explícita e li com interesse o Discussão SO de quando pode ser apropriado.

Eu também li sobre (mas não usei) Vaia que parece levar as coisas um passo adiante, tornando-o opcional para 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 da linguagem C# se preocuparam em incluir uma palavra-chave var?

Atualizar:Sim, var suporta tipos anônimos, mas os tipos anônimos por si só não necessitam da palavra-chave var...

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

contra

anon = new { Name = "Terry", Age = 34 };
Foi útil?

Solução

Atualizar: Na verdade, existem duas questões relacionadas: 1. Por que tenho que declarar variáveis? 2. Qual é o uso "var" em um idioma que faz você declarar variáveis?

As respostas para (1) são numerosas e podem ser encontradas em outros lugares para esta pergunta. Minha resposta para (2) está 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 de lado direito de uma expressão é desconhecido para o programador ou é extremamente detalhado. Considerar:

SomeGeneric<VeryLongTypename<NestedTypename>> thing = new   
SomeGeneric<VeryLongTypename<NestedTypename>>();

Verboso e propenso a erros, certo? Então agora eles deixaram você fazer isso:

var thing = new SomeGeneric<VeryLongTypename<NestedTypename>>();

Ao reduzir a duplicação de informações, os erros são eliminados. Observe que não há apenas erros de digitação aqui: é possível que o tipo de expressão à esquerda seja enevoado de tal maneira que o compilador possa ser lançado silenciosamente da esquerda para a direita, mas o elenco realmente perde alguma propriedade do rvalue. Isso é ainda mais importante quando os tipos retornados pelo RValue podem ser desconhecidos ou anônimos.

Outras dicas

Sem a palavra -chave Var, torna -se possível criar acidentalmente uma nova variável quando você realmente 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 ele serve muito bem a esse propósito.Não ter nenhuma palavra-chave e apenas definir variáveis ​​dinamicamente, sem nenhum tipo, é assustador.Você está prejudicando o próximo cara que precisa manter seu código ou a si mesmo se precisar retrabalhar o código que não tocou há mais de um ano.Não tenho certeza se essa é uma porta que deve ser aberta em C# e espero que não seja, pois var já está causando problemas de legibilidade ao ser usado demais quando não é necessário.

Quase todos os exemplos do .net 3.5 que estou vendo ultimamente têm todas as variáveis ​​definidas com var.

O argumento que defendo é que ele realmente sacrifica a legibilidade para salvar as teclas digitadas quando é usado demais.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();

Então o próximo argumento será: basta nomear melhor a função...

var weight = GetExactWeightOfTheBrownYakInKilograms();

Ainda não sei o que está voltando.É um objeto int, decimal, float, peso, o quê?Ainda vou perder tempo pesquisando...preciso da muleta intellisense para salvar o dia da minha programação preguiçosa.Talvez inclua o tipo de retorno no nome da função.Boa ideia, agora usar var não nos salvou de nada, exceto fazer com que todas as minhas funções tivessem nomes realmente longos.

Acho que as pessoas estão usando var e isso está levando a uma programação preguiçosa, que por sua vez leva a um código mais difícil de ler.Cada vez que você digita a palavra-chave var, você deve ter um bom motivo para usá-la, em vez de ser explícito.

Isso é um pouco subjetivo, mas acho que projetar o C# 3.0 para ter a palavra-chave "var" para variáveis ​​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 excessivamente simplistas.Acho que você pode ver onde isso vai dar.Em situações complexas, pode ser bom encontrar o local onde uma variável é realmente definida.

Em sua pergunta, var agrega valor ao código dizendo ao compilador a palavra anon agora é legal para uso em qualquer lugar que você esperaria ver um item do tipo implícito na tarefa. Exigir a introdução de nomes ao compilador como esse permite que o compilador rejeite as coisas que não foi dito explicitamente são permitidas e, assim, capturar certos tipos de erros no tempo de compilação para que não explodam no 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 de permitir dessa maneira é que ele transforma qualquer coisa no lado esquerdo de qualquer tarefa em que o nome não existisse anteriormente em uma declaração variável, mesmo que seja realmente um erro de digitação. Se posteriormente, no programa, você atribui outra coisa a Anon e, em seguida, ainda mais em referência ao novo valor, mas a declaração do meio teve 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 ser bom ou pelo menos possível. Mas isso é um arenque vermelho. Estamos falando de C#, não Boo. Um dos propósitos de C# é ter um idioma em que o compilador possa capturar o maior número possível de erros. Boo quer fazer isso também, mas também quer ser mais parecido com Python. Então isso sacrifica algum (Nem todos) da segurança do tempo de compilação de C#em troca da sintaxe do tipo Python.

Isenção de responsabilidade: Meus exemplos são Java porque é isso que eu sei, mas os conceitos devem ser idênticos.

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

bill=5;
bi11=bill+5

Qual é o valor de Bill?

Dito isto, acho um pouco irritante às vezes digitar:

DataOutputStream ds=new DataOutputStream();

Parece redundante, mas honestamente não há nada realmente errado com isso. Não é mais preciso digitá -lo duas vezes, e é extremamente útil. O que leva tempo é quando você tem perguntas-quando você 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, pode ter digitado 30 ou 40 declaração, o suficiente para cada declaração necessária para as próximas duas semanas.

Acho que estou dizendo que, embora entenda o estresse emocional que se repetir pode causar, a consistência, a clareza e a capacidade de criar ferramentas mais inteligentes deixam de valer a pena.

Mais uma coisa, na maioria das vezes o código não deve ser como o meu exemplo acima. O que você deveria estar fazendo é o seguinte:

DataOutput ds=new DataOutputStream();

Isso esconde imediatamente o fato de que você está usando uma classe de concreto em um modelo. Esse modelo deve poder fazer todas as operações necessárias em sua classe. Mais tarde, se você quiser substituir o DS por algum outro tipo de fluxo de saída, basta alterar essa linha única a corrigirá. Se você estava usando os recursos não disponíveis para o DataOutput, fundindo para o DataOutputStream, o editor descobrirá facilmente e informará.

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

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

Acredito que var (e várias outras novas palavras-chave) foram adicionadas especificamente para oferecer suporte ao Linq.

var é a palavra-chave usada para criar um tipo anônimo - veja http://msdn.microsoft.com/en-us/library/bb397696.aspx

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

var é extremamente útil para Linq.Na verdade, segundo um autor especialista, “Sem ‘var’, o uso do LINQ fica muito difícil."

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top