C# 3.0: Por que var?

Publicado: 20/08/2008 em C#

Hoje saindo do trabalho com um amigo do trampo passamos por uma banca e ele me questionou sobre o que era "LINQ" que estava escrito em uma revista de .Net, não lembro qual eheheh

Durante a conversa rápida chegamos ao polêmico "var".

Quando expliquei o papel do var no C# 3 ele logo disse algo como: "estamos voltando à tipagem fraca".

Aí surgiu a idéia deste post, pra falar um pouco do porquê do var.

Como sempre, podemos começar pela documentação da linguagem

var (C# Reference)
http://msdn.microsoft.com/en-us/library/bb383973.aspx

Na documentação a palavra chave var é definida como indicador de tipo implícito e tem um exemplo excelente para exibir a diferença entre a declaração de um membro de tipo implícito e tipo explicíto.

var i = 10; // implicitly typed
int i = 10; //explicitly typed

Quando utilizamos o var ao invés do tipo na declaração o compilador infere o tipo da atribuído à variavel, no exemplo ele assume que a variável está recebendo um inteiro e assim será em toda a sua vida, não adianta tentar atribuir uma string na próxima linha, que o compilador não permitirá, inclusive a compilação do visual studio já aponta erro, vejam:

image

Já temos a indicação que a variável q é do tipo int e ponto final.
Até aqui ainda fica a impressão no ar de que o var é uma forma de voltarmos ao variant do visual basic ou então a programação extremamente flexível do javascript onde podemos tudo, sem tipagem, o que é muito ruim.

Mas existem alguns recursos do C# + LINQ que só são possíveis com o mecanismo de flexibilidade que o var oferece.

Vamos começar pelos Anonymous Types:

Anonymous Types (C# Programming Guide)
http://msdn.microsoft.com/en-us/library/bb397696.aspx

Basicamente são tipos definidos de maneira dinâmica, sem necessitar de um tipo explicito previamente definido.
Exemplo:

image

Com esta construção armazenamos duas propriedades somente leitura em um tipo anônimo representado pela variável shinji.
Um detalhe importante sobre os anonymous types é que eles não são tipos genéricos e não causa boxing e unboxing de uma maneira oculta, eles são realmente objetos fortemente tipados, a diferença é que o compilador cria a implementação pra gente onde lhe é conveniente, dispensando o trabalho.
Vejam o que foi gerado com a compilação deste meu código, tanto o reflector quando o ILDASM entendem a classe AnonymousType0 como uma classe comum, claro com uma implementação mais complexa do que se fossemos escrever, mas é um recurso extremamente interessante.

 image

Interessante não? Uma solução muito legal que permite uma flexibilidade muito grande ao escrevermos aplicações, mas nenhum caso citado até agora justifica os esforços do pessoal da equipe do C#, porém com o LINQ conseguimos entender justamente o motivo e o valor de tudo isto para nosso código.

Vejamos um exemplo para recuperar a lista de processos correntes no sistema operacional utilizando var, anonymous types e linq em conjunto:

image

O que realmente aconteceu aqui? Resumimos a coleção de objetos System.Diagnostics.Process, recuperada pelo metodo GetProcess() para uma coleção de um objeto que contém apenas a processos que estão sendo executados em prioridade alta e com as informações que nos interessam na situação, ID e ProcessName.
Isto tudo sem termos que criar uma classe anteriormente pra isto.

Otimizamos assim a utilização de nossa coleção e é um recurso extremamente útil para unirmos em um objeto informações diferenciadas. Poderíamos nesta consulta estar trabalhando com duas coleções, utilizar um JOIN e obter um resultado disto tudo em apenas um objeto, o que facilita muito a nossa vida, sem a necessidade de mais interações no futuro.

É isto pessoal, percebem como o var é importante? Sem ele teríamos bem mais trabalho para realizar estas tarefas, então ele vale a pena, porém deve ser usado com cautela onde é necessário, para que não perdamos a legibilidade do nosso código sem tipos, o que seria algo ruim e um regresso.

Espero que tenham gostado e que ajude!

Divirtam-se!

[]’s
Shinji

Technorati Tags: ,,
comentários
  1. Fernando disse:

    Hhehe, show de bola o post, simples e objetivo.Por essas e outras que não sei mais programar no 2.0 :|[]’s

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s