Desenvolvimento - Visual Basic .NET

Algumas coisas legais do Visual Basic .Net 9.0 - 2008

Vem ai mais uma versão do Visual Basic! Junto com a nova versão do Framework, a versão 3.5 temos algumas implementações interessantes em uma das linguagens mais utilizadas do mundo..

por Alexandre Tarifa



Vem ai mais uma versão do Visual Basic! Junto com a nova versão do Framework, a versão 3.5 temos algumas implementações interessantes em uma das linguagens mais utilizadas do mundo.

Um pouco de história

O Visual Basic foi totalmente refeito com o lançamento da plataforma .Net, e desde então continuou evoluindo junto com o Framework. Atrelado a versão 1.1 do Framework tínhamos o VB 7, e com a versão 2.0 ou VB 8 ou Visual Basic 2005.

A evolução do Framework é significativa, já que em 2002 tivemos o lançamento da versão 1.0 e apenas 5 anos depois já estamos na versão 3.5.

Veja a tabela desta evolução:

2002

2003

2005

2006

2008

Visual Studio

VS 2002

VS 2003

VS 2005

VS 2005 + Add In

VS 2008 beta

Linguagens

VB 7.0

C# 1.0

VB 7.1

C# 1.1

VB 8.0

C# 2.0

VB 8.0
C# 2.0

VB 9.0
C# 3.0

Framework

1.0

1.1

2.0

3.0

3.5

CLR

1.0

1.1

2.0

2.0

2.0


Podemos acompanhar também a evolução da linguagem depois da Plataforma .Net:

Acompanhando as discussões em blogs do time de VB (http://blogs.msdn.com/vbteam) podemos reparar nos seguintes objetivos:

· Simplificar ainda mais o código;

· Não ignorar as versões anteriores;

· Tornar a linguagem funcional e extensível;

· Não revolucionar nada.

Inicializadores de Objetos

A inicialização de objetos esta presente há muito tempo na linguagem, e parece ser algo inofensivo, algo totalmente sem segredo... se analisarmos um código muito simples, realmente isso é verdade!

Dim cli As New Cliente

Como disse, sem segredo algum... mas vamos dar uma olhada em um código onde configuramos a propriedade de alguns clientes e adicionando em uma lista de clientes:

Dim lista As New List(Of Cliente)

Dim cli1 As New Cliente

cli1.Nome = "Cliente 1"

cli1.Idade = 28

lista.Add(cli1)

Dim cli2 As New Cliente

cli2.Nome = "Cliente 2"

cli2.Idade = 28

lista.Add(cli2)

Dim cli3 As New Cliente

cli3.Nome = "Cliente 3"

cli3.Idade = 28

lista.Add(cli3)

Dim cli4 As New Cliente

cli4.Nome = "Cliente 4"

cli4.Idade = 28

lista.Add(cli4)

Dim cli5 As New Cliente

cli5.Nome = "Cliente 5"

cli5.Idade = 28

lista.Add(cli5)

A idéia dos inicializadores de objetos, é através do With (não é o velho With J ) fazer a inicialização de objetos.

Dim cli As New Cliente With {.Nome = "Cliente 1", .Idade = 10}

Neste caso então, o With na seqüência da instância do objeto já disponibiliza as propriedades e já é possível passar os valores.

Se compilarmos o código e decompilar o código, veja o que ocorre (utilizando o reflector - http://www.aisto.com/roeder/dotnet)

Dim  VB$t_ref$S0 As New Cliente  
    VB$t_ref$S0.Nome   = "Cliente 1"
  VB$t_ref$S0.Idade  = 10

Veja que o compilador criou uma variável com um nome estranho e atribuiu os valores da mesma forma que fizemos anteriormente. Ou seja, o código gerado após compilar é idêntico ao que criamos.

O código completo ficaria assim:

Dim lista As New List(Of Cliente)

lista.Add(New Cliente With {.Nome = "Cliente 1", .Idade = 10})

lista.Add(New Cliente With {.Nome = "Cliente 2", .Idade = 20})

lista.Add(New Cliente With {.Nome = "Cliente 3", .Idade = 30})

lista.Add(New Cliente With {.Nome = "Cliente 4", .Idade = 12})

lista.Add(New Cliente With {.Nome = "Cliente 5", .Idade = 14})

Inferência de tipos


As linguagens .Net são fortemente tipadas... isso já é fato desde a versão 1.0 do framework. Porém agora, também temos a inferência do compilador na decisão de qual tipo iremos utilizar... não entenda isso como... deixamos de ser fortemente tipados!

Normalmente trabalhamos assim:

Dim nome As String = "Valor String"

Dim idade As Integer = 10

Mas agora podemos deixar que o compilador decida por nós J

O código:

Dim nome = "Valor String"

Dim idade = 10

Vamos decompilar e:

Public Shared Sub Main()  
  Dim nome As String = "Valor String"
 Dim idade As Integer = 10

A mesma coisa J

Métodos de extensão


Podemos também a partir de agora, criar um método de extensão a alguma classe já existente... por exemplo: podemos adicionar um método na classe String, sem herdar a classe ou sobrescrever algo já existente.

Exemplo:

<System.Runtime.CompilerServices.Extension()> _

Public Sub Exibir(ByVal s As String)

Console.WriteLine(s)

End Sub

Veja que adicionamos um atributo no médoto (obrigatório) e um parâmetro do tipo string.

Agora, se tivermos uma string:

Dim a As String = "Alexandre"

Podemos chamar o método criado anteriormente:

a.Exibir()

Então, é assumido que o parâmetro do método de extensão é o valor atribuído a variável.

Linq

Para quem trabalha com coleções, uma das tarefas mais chatas está associado a navegação trabalhosa entre os itens da lista... ou então, um excesso de carrega, descarrega pra cima e para baixo que acontece durante a execução. O Linq (Language Integrated Query) trás a possibilidade de navegarmos dentro de coleções de objetos. Para saber mais sobre LINQ veja aqui...

Um exemplo simples, se tivermos uma lista de Clientes (Dim lista As New List(Of Cliente)) alimentada, podemos buscar os dados neste objeto de forma semelhante a uma consulta.

Podemos adicionar alguns itens:

Dim lista As New List(Of Cliente)

lista.Add(New Cliente With {.Nome = "Cliente 1", .Idade = 10})

lista.Add(New Cliente With {.Nome = "Cliente 2", .Idade = 20})

lista.Add(New Cliente With {.Nome = "Cliente 3", .Idade = 30})

lista.Add(New Cliente With {.Nome = "Cliente 4", .Idade = 12})

lista.Add(New Cliente With {.Nome = "Cliente 5", .Idade = 14})

A partir daí, podemos fazer uma query com filtros, comparações e o que mais for necessário:

Dim clientes = From c In lista _

Where c.Idade > 12

Teremos então uma coleção de clientes com a idade maior que 12 anos, então basta navegar na coleção de clientes:

For Each c As Cliente In clientes

Console.WriteLine(c)

Next

Conclusão

São facilidades e recursos que aumentam principalmente a produtividade de desenvolvimento. O que foi apresentado aqui também é possível utilizarmos com o C#, com a sintaxe específica dele.

As linguagens evoluem, e temos que acompanhar isso para utilizarmos ao máximo o poder do que utilizamos.

Alexandre Tarifa

Alexandre Tarifa - Ministra palestras e treinamentos, MVP (Most Valuable Professional), MCAD (Microsoft Certified Application Developer) e MCT (Microsoft Certified Trainer). Bacharel pela UMESP e pós-graduando pela Universidade Federal de São Carlos em Ciência da Computação. Analista de Sistemas e Líder do grupo de usuários Codificando.net São Paulo (sp.codificando.net). Escreve artigos para a revista MSDN Magazine e para os sites Linha de Código, MSDN Brasil e Enterpriseguys.
Visite o blog do autor: http://weblogs.pontonetpt.com/alexandretarifa/.