VB.NET - Apresentando Generics


Os conceitos sobre coleções devem ser conhecidos por qualquer programador, independente da linguagem que irá usar, pois cada uma tem uma implementação do assunto, umas com mais outras com menos recursos.

Os conceitos sobre coleções já foram apresentados nos seguintes artigos :

Mas o que tem a ver o conceito sobre coleções com o Generics ?    E o que é Generics ?

Generics é um novo conceito introduzido na versão 2.0 da plataforma .NET para resolver um antigo problema que tínhamos com as coleções.

Nota: Você ainda continua podendo usar as coleções padrão anteriormente oferecidas pela plataforma .NET.

As coleções implementadas na .NET Framework nos ajudam a resolver muitos problemas no dia da dia da programação. Quem nunca usou um ArrayList ou uma HashTable ?

Se você já utilizou coleções se deparou com o seguinte problema:  As coleções tem capacidade de de colecionar itens do tipo Object.

Como exemplo vou usar a classe Cliente criada no artigo - VB.NET - Usando Coleções - (sem o construtor):

Public Class Cliente

    Private _nome As String
    Private _email As String

    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal Valor As String)
            _nome = Valor
        End Set
    End Property

    Public Property Email() As String
        Get
            Return _email
        End Get
        Set(ByVal Valor As String)
            _email = Valor
        End Set
    End Property

End Class

Perceba que tudo que for incluído na coleção via método Add será incluído como um Object, ou seja, podemos incluir qualquer tipo de dado na coleção. Assim:

clientes.Add(1)                       'incluindo um inteiro

clientes.Add(New Cliente)         'incluindo um objeto

clientes.Add("teste")               'incluindo uma string

Por este motivo ao retirar um item da coleção você tem que fazer o casting de Object para o tipo de dado que incluiu. (esdrúxulo, não é mesmo...)

Assim se eu guardar um item do tipo String em uma coleção ela irá armazenar um object. Se for um integer a mesma coisa e assim por diante.

Com isto temos sempre que estar tipando manualmente cada item da coleção quando formos tratá-los. Desta forma quando eu coloco um item em uma coleção faço o boxing e quando eu retiro um item da coleção faço o unboxing.

Tudo isto é muito trabalhoso, tedioso e nada produtivo devido a necessidade de conversão object->tipo-do-item e vice-versa ter que ser feita manualmente.

Resumindo os problemas com coleções no VB.NET:

Diante deste quadro a solução introduzida foi Generics. Podemos dizer que Generics são coleções tipadas de modo que somente um tipo de dado pertença a coleção. Ao se tentar inserir outro tipo de dado o compilador irá reclamar. Assim sabemos o que cada coleção contém e não precisamos fazer a conversão na hora de retirar um item da coleção.

A versão 2.0 da plataforma  .NET introduziu as coleções genéricas que ficam agrupadas no namespace System.Collections.Generics

As principais coleções genéricas são:

Nota: O parâmetro (Of T) na declaração da lista é obrigatório e indica qual o tipo de dados que poderá ser incluído na coleção.

Para mostrar como podemos usar generics vamos usar o mesmo exemplo da classe Cliente, lembrando que para isto devemos usar o VS.NET 2005 ou o Visual Basic 2005 Express.

Abra um novo projeto no VB 2005 e inclua uma nova classe via Menu Project selecionando Add Class e informando o nome Clientes.vbp.

O código da classe esta mostrado abaixo. A diferença é que incluímos um construtor para melhor exemplificar.

Vamos usar a coleção List para mostrar como pode usar generics na versão 2.0 do .NET Framework.

Public Class Cliente

     Private _nome As String
     Private _email As String
 

    Public Sub New(ByVal nome As String, ByVal email As String)

           Me.Nome = nome

        Me.Email = email

    End Sub

 
    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal Valor As String)
            _nome = Valor
        End Set
    End Property

    Public Property Email() As String
        Get
            Return _email
        End Get
        Set(ByVal Valor As String)
            _email = Valor
        End Set
    End Property

End Class

Note a utilização do namespace  System.Collections.Generic

Declaramos a coleção clientes do tipo List assim:

Dim clientes As New List(Of Cliente)

Com isto queremos dizer que a coleção clientes é do tipo List e aceita somente itens do tipo Cliente ( a nossa classe ao lado)

Em seguida incluímos , via método Add, um item do tipo Cliente na coleção:

clientes.Add(New Cliente("Macoratti", "macoratti@yahoo.com"))

Agora , perceba que ao tentarmos incluir um tipo diferente de Cliente, como um String ou Integer, o VB irá reclamar indicando que o valor não pode ser convertido para o tipo definido na coleção.

clientes.Add("Macoratti", 1)  -> Erro

O mesmo comportamento você poderá com as outras coleções generics. Uma solução simples mas que ajuda muito a vida dos desenvolvedores.

Mas generics não se limita a isto pois podemos criar nossas próprias classes dando suporte a generics.

Uma tarefa muito usada é preencher uma coleção em memória com objetos obtidos de um banco de dados. (Em java criamos os beans para fazer este tipo de serviço).  Ao armazenar os dados em memória o acesso fica mais rápido, sendo que a única limitação seria a memória RAM. Podemos criar classes que herdam o comportamento das coleções generics (a famosa herança)

Vamos criar uma classe chamada dadosBeans dando suporte a genérica para mostrar como esta tarefa fica muito mais fácil e segura.

No projeto no qual já criamos a classe cliente vamos incluir uma nova classe chamada dadosBeans com o seguinte código:

Imports System.Collections.Generic
 

Public Class dadosBeans(Of itemtype)

     Inherits Generic.SortedDictionary(Of Integer, itemType)

     '.....................

End Class

Vamos agora usar a nossa classe dadosBeans e verificar seu comportamento:

Declaramos uma coleção do tipo da classe que da suporte a generics e definimos que o tipo de dados da coleção seria o objeto cliente.

A seguir incluímos um objeto do tipo Cliente sem problemas na coleção. Mas ao tentarmos incluir um item de tipo diferente do definido o VB.NET irá acusar um erro conforme abaixo.

O principal motivo que o levaria a usar as coleções generics é o desempenho. Geralmente as coleções generics são mais rápidas do que as antigas classes de coleções.

Existem muitas outras funcionalidades que podemos explorar usando generics, mas isto é assunto para outro artigo.

Até lá..

I Know , it´s only VB.NET but I like it.


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

   Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti