Desenvolvimento - Visual Basic .NET

Visual Basic.net 9.0 (Orcas)

Este artigo visa apresentar algumas novidades que estão vindo na nova linguagem Visual Basic 9.0.

por Leonardo Bruno Bentes Lima



Objetivos: Este artigo visa apresentar algumas novidades que estão vindo na nova linguagem Visual Basic 9.0.

Aplica-se: Visual Studio (Orcas)

A próxima versão do Visual Basic está chegando aí, e quando eu lembro do velho Visual Basic 6 que usei durante tanto tempo, vejo que realmente não é mais a mesma linguagem, nem mesmo é a evolução dele. A nova geração do VB é realmente uma outra linguagem que guarda apenas algumas semelhanças na sintaxe. Bem, deixando o saudosismo de lado, vamos ver o que vem de novo por aí.

# Inferência de tipos: Ocorre quando não há declaração explícita do tipo do objeto, e o compilador descobre e atribui o tipo correto ao objeto declarado. Ao contrário das versões anteriores, onde isso era possível, mas com o uso de Late Binding, a inferência de tipos define o tipo em "tempo de design" e a gente pode vê-lo atribuído durante a codificação propriamente dita. Outro detalhe é que caso você queria fazer uso de Late binding, terá que fazer explicitamente, ou seja, declarar o objeto com o tipo "Object". Essa opção é a default para novos projetos. (Option Infer)

Exemplo:

Dim Nome = "Leonardo Lima"

Dim Idade = 29

As declarações acima são equivalentes à:

Dim Nome as String = "Leonardo Lima"

Dim Idade as Integer = 29

A regra básica é que o objeto precisa ser incializado, ou seja, se você fizer assim:

Dim Nome

Vai acontecer uma exceção.

# Inicialização de objetos (Object Initializers): Nova forma de instanciar objetos no VB.NET 9.0. É semelhante à instrução With, mas obviamente com mais recursos. Imagina que temos o seguinte objeto sendo instanciado e alimentado:

Dim c as new Cliente

With c

.Nome = "Leonardo Lima"

.Idade = 29

.Empresa = "Banco do Nordeste"

End with

Com a nova forma de inicialização temos o seguinte:

Dim c = new Cliente With {.Nome = "Leonardo Lima", .Idade = 29, .Empresa = "Banco do Nordeste"}

E se nós quisermos criar um array de Clientes? É simples, usaremos basicamente a mesma estrutura, chamada Array Initializer.

Exemplo:

Dim c = { _

new Cliente With {.Nome = "Leonardo Lima", .Idade = 29, .Empresa = "Banco do Nordeste"}, _

new Cliente With {.Nome = "José Silva", .Idade = 50, .Empresa = "Banco do Brasil"}, _

new Cliente With {.Nome = "Francisco Pereira", .Idade = 45, .Empresa = "Caixa"} _

}

Diante dos exemplos, percebemos além da nova forma de inicializar um objeto, também o uso de inferência de tipo. No exemplo acima o objeto "c" será um array de Clientes. Elegante não?

# Tipos anônimos (Anonymous Type): Imagine que deseja obter a referência de um tipo de objeto que não existe, baseado em um objeto real. Normalmente você iria criar uma nova classe base, usar herança, extender, etc. Com os tipo anônimos, isso não é preciso, basta instanciar um novo objeto sem especificar o tipo. Estranho? vamos ver.

Digamos que eu tenha um array de Clientes e quero fazer uma consulta (usando Linq to objects e Query Expression) que me retornará um único objeto Cliente, mas eu desejo que esse objeto retornado tenha apenas os campos: Nome e Idade.

Dim ClienteVip = From cv in c _

Where cv.Nome = "Leonardo Lima" _

Select cv

Na consulta acima, o objeto cv conterá o resultado da query para o objeto Cliente. Mas como eu quero apenas os campos Nome e Idade, eu posso usar tipos anônimos.

Dim ClienteVip = From cv in c _

Where cv.Nome = "Leonardo Lima" _

Select New With {.Nome = cv.Nome, .Idade = cv.Idade}

A expressão acima é igual a:

Dim ClienteVip = From cv in c _

Where cv.Nome = "Leonardo Lima" _

Select New With {cv.Nome, cv.Idade}

Que por sua vez é igual a:

Dim ClienteVip = From cv in c _

Where cv.Nome = "Leonardo Lima" _

Select cv.Nome, cv.Idade

Ou seja, eu posso usar os tipos anônimos de forma completa ou abreviada como mostrei acima e a partir dele será criada uma nova classe implicitamente com o nome: _Nome_As_String_Idade_As_Integer_ e com a estrutura contendo apenas os campos que eu especifiquei.

# Query Expression: As expressões mostradas no exemplo anterior são chamadas de query expression, e fazem parte da linguagem. Nessas query expressions, fazemos uso de vários recursos novos na linguagem VB.NET 9.0, tais como inferência de tipos, tipos anônimos, extension methods (veremos mais adiante), query operators, etc.

Uma query expression é uma expressão que nos permite fazer consultas em cima de uma coleção de objetos, e os query operators nos auxiliam na montagem da query. Vamos ver os principais query operators para consultas básicas:

- From: Especifica a coleção a ser consultada e a chamada "Range Variable", que representa o conjunto resultante da expressão e que será retornado na query

- Select: Especifica o conjunto a ser retornado na query, que pode ser ou não a própria Range Variable

- Where: Usado para restringir os itens na coleção

- Group By: Usado para agrupar os itens da coleção

- Join: Usado para juntar duas coleções baseada nos elementos chaves de cada uma

Lembra as consultas SQL não é?

# Extension Methods: É a estrutura base para as query expressions. Na prática, o compilador transforma as expressions em chamadas aos extension methods. por exemplo: o query operator "Where", é transformado em uma chamada para um extension method Where, que tem a seguinte estrutura:

<Extension> _

Function Where(Of TSource)(Source as INumerable(Of TSource), predicate as Func(Of TSource, Boolean)) as INumerable(Of TSource)

...

End Function

Então na query abaixo:

Dim ClienteVip = From cv in c _

Where cv.Nome = "Leonardo Lima" _

Select cv.Nome, cv.Idade

teríamos o seguinte:

Dim ClienteVip = Enumerable.Select(Enumerable.Where(c, Function(cv as cv) cv.Nome = "Leonardo Lima",Function(cv as cv) cv.Nome, cv.Idade)

Agora complicou, mas não se preocupe, se você aprender a usar os query operators já é um bom começo.

# Nullable Types: trocando em miúdos, é a possibilidade de atribuir um valor nulo a um tipo de dado que anteriormente não aceitaria. Isso pode feito através do uso de generics da seguinte forma.

Dim d as Nullable(Of DateTime)

Conclusão:

O que eu apresentei aqui é apenas uma pequena parte das mudanças que virão, e com elas, ganharemos em várias frentes: diminuição de redundância e a conseqüente redução de código, integração com as API´s do Linq e para quem achava que não era possível, um aumento na produtividade em relação ao já produtivo VB.NET 8.0 (Visual Studio 2005).

Fonte: http://msdn2.microsoft.com/en-us/library/ms364068(vs.80).aspx

Leonardo Bruno Bentes Lima

Leonardo Bruno Bentes Lima - Microsoft Most Valuable Professional, consultor em tecnologia .NET. Possui ampla experiência no desenvolvimento e analise de sistemas, dos quais 6 anos na plataforma .Net. Palestrante em diversos eventos sobre tecnologia .NET no Brasil e exterior. Atualmente trabalha Ivia informática (www.ivia.com.br).