LINQ - Conceitos básicos e fundamentos
Eu não vou falar exatamente sobre os recursos do LINQ neste artigo mas dos conceitos básicos e dos fundamentos sobre as novidades implementadas para dar suporte ao LINQ.
Sim, é isso mesmo, para que o LINQ possa realizar as suas peripécias foi necessário agregar novas características a linguagem VB .NET e C# formando assim alguns dos alicerces sobre os quais o LINQ se apóia. Implementar os recursos oferecidos pelo LINQ sem esses recursos não seria a mesma coisa.
Então vamos aos fundamentos...
Apresentando a Inferência de tipos
De forma clara e sem rodeios, a inferência de tipos (local variable type inferencing) significa dizer que o compilador é capaz de 'adivinhar' o tipo de dados de uma variável. É o sonho de todo o programador : não precisar se preocupar mais em declarar variáveis... mas como é que isso funciona ??
Para explicar esse recurso vou usar um trecho de código do LINQ, veja:
Dim var = From numeros In New
Integer() {1, 7, 5, 3, 8, 6, 2, 4, 9} _ Where numeros > 5 _ Select numeros For Each x In var ListBox1.Items.Add(x) Next |
No IDE do Editor do VB 2008 Express Edition podemos identificar as variáveis usadas no código acima. Assim temos que:
1 - A variável var do código acima pode ser identifica como sendo do tipo IEnumerable(Of Integer);
2- A variável números usada na sintaxe LINQ é do tipo Integer;
3- A variável x usada no laço For/Each é do tipo Integer;
Agora uma pergunta sutil.
Onde declaramos estas variáveis ?
Em lugar nenhum.
Mas então como é que o danado do compilador consegue 'adivinhar' o tipo das variáveis ?
Nas versões anteriores do Visual Basic poderíamos até declarar um valor a uma variável sem definir o tipo mas a variável seria considerada do tipo Object. Assim, no código abaixo, as variáveis a e b seriam identificadas como do tipo Object:
Dim a = 100
Dim b = DateTime.Now()
Qual é então a mágica feita na nova versão do VB.NET / C# para inferir os tipos de dados não declarados ?
Clique duas vezes sobre My Project, abra a aba Compile e verifique que existe uma opção chamada Option Infer , e, que a mesma esta definida como On.
Bingo ! A inferência de tipos agora pode ser ativada ou não e por padrão ela esta ativa.
Mas por que a inferência de tipos é necessária ?
Devido ao LINQ permitir a criação de um tipo que não é definido de forma explícita.
Por causa disso, para atribuir uma variável a uma expressão com um tipo definido de forma implícita, o compilador precisa inferir o tipo, pois de outra não seria possível defini-lo via código.
O tipo da variável será definido a partir do valor com o qual você a inicializa.
Logo temos algumas regras para que isso funcione:
Uma variável sempre deve ser inicializada;
Você não pode inicializar uma variável com um tipo nulo;
Você não pode inicializar uma variável com ela mesma;
Você não pode incluir múltiplas variáveis em uma mesma declaração;
Eu sei é apenas LINQ mas eu gosto.
Referências sobre LINQ:
José Carlos Macoratti