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 :
VB - Usando a classe Collection. - Usando coleções no VB6. Exibindo um formulário pelo nome.
VB.NET - Usando Coleções. - Usando Coleções do .NET Framework. As principais classes de coleções.
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:
As coleções aceitam qualquer tipo de dados
As coleções fazem a conversão implícita dos tipos de dados para Object
Ao tratarmos os itens das coleções temos que fazer o caminho de volta Object-> tipo-do-item via casting
As coleções não exibem suas propriedades no intelissense
Tudo isto é transparente para o desenvolvedor e a depuração pode ser traumática.
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:
List(Of T) - Representa uma lista fortemente tipada de objetos que podem ser acessados através de um índice. Fornece os métodos Search, Sort e efetua a manipulação da lista.
LinkdeList(Of T) - Organiza os itens na forma de uma lista duplamente ligada.
Stack(Of T) - Organiza os itens na forma de um pilha.(LIFO - last-in first-out)
SortedList(Of TKey, TValue) - Representa uma coleção de pares representados por chave/valor que são ordenados pela chave com base na implementação de System.Collections.Generic.IComparable associada.
SortedDictionary(Of TKey, TValue) - Representa uma coleção de pares representados por chave/valor que são ordenados pela chave.
Queue(Of T) - Organiza os itens na forma de uma fila.(FIFO - first-in firs-out)
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.GenericPublic 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: