C# - Substituindo ArrayList pela coleção Genérica
Neste artigo veremos como substituir a utilização de ArrayList com a versão genérica para melhorar o desempenho do seu código. |
O conceito de Generics foi introduzido a partir da versão 2.0 da .NET Framework. Nesta versão foi introduzido o namespace System.Collections.Generic, que contém as classes que suportam este conceito, como as classes List, Queue, Stack , LinkedList e outros recursos que podem ser usados efetivamente em seus programas.
Nas versões anteriores a 2.0, a generalização era realizada pela conversão de tipos de, e, para a base do tipo universal System.Object; que fornece uma solução para essa limitação em tempo de execução.
Essa limitação pode ser demonstrada com a ajuda da classe de coleção ArrayList do NET Framework. ArrayList é uma classe de coleção altamente conveniente que pode ser usada sem modificação para armazenar qualquer tipo de referência ou valor.
Mas esta conveniência tem um custo. Qualquer tipo de referência ou valor que é adicionado a um ArrayList é implicitamente convertido via typecast para System.Object. Se os itens são tipos de valor, eles devem sofrer um boxing quando adicionado à lista, e unboxing quando eles são recuperados.
O conversão forçada (coersão), boxing e unboxing são operações que degradam o desempenho, o efeito de boxing e unboxing pode ser bastante significativo em cenários onde você deve percorrer grandes coleções.
Assim se você quer melhorar o desempenho do seu aplicativo, bem como tornar o código mais fácil de trabalhar pode substituir todos os objetos ArrayList pela versão genérica evitando as operações de boxing/unboxing.
A título de exemplo vamos partir de um código que usa ArrayList :
public static void UsandoArrayList()
{
// Cria e popula um ArrayList.
ArrayList numeros = new ArrayList();
numeros.Add(1); // causa uma operação de boxing
numeros.Add(2);
// Exibe os numeros causando um operação de
// unboxig em cada operação
foreach (int i in numeros)
{
Console.WriteLine(i);
}
numeros.Clear();
}
|
Para realizar conversão do ArrayList para a respectiva coleção genérica basta substituir as ocorrências de System.Collection.ArrayList por System.Collections.Generic.List que é mais eficiente:
public static void UsandoGenericList() { // Cria e popula uma List List<int> numeros = new List<int>(); numeros.Add(1); numeros.Add(2); // exibe todos os inteiros
foreach (int i in numeros)
{
Console.WriteLine(i);
}
numeros.Clear();
}
|
Como o ArrayList é ainda muito usado ele pode ser um forte canditato para iniciar a substituição e melhorar o desempenho do seu código.
Somente a título de esclarecimento abaixo segue uma lista de métodos disponíveis na lista genérica que não existem no ArrayList:
Contornando os problemas
Agora, o ArrayList possui vários métodos estáticos para os quais não há equivalente direto na classe de lista genérica. Para contornar esse problema você vai precisa fazer um pouco de trabalho. Como exemplo, a correspondência mais próxima para o método estático ArrayList.ReadOnly é a método AsReadOnly.
Já o método estático ArrayList.Repeat não tem um equivalente direto na lista genérica. Neste caso você pode usar o seguinte método de extensão genérico:
public static void Repeat<T>(this List<T> list, T obj, int count)
{
if (count < 0)
{
throw (new ArgumentException("O parâmetro Count deve ser maior ou igual a zero."));
}
for (int index = 0; index < count; index++)
{
list.Add(obj);
}
}
|
Este método de extensão genérico possui três parâmetros:
Outro método que não existe na lista genérica é o método Clone. Podemos contornar isso usando o método GetRange da lista genérica :
List<int> minhaLista = new List<int>( );
// Popular a lista...
List<int> novaLista = minhaLista.GetRange(0, novaLista.Count);
|
Aqui o método GetRange executa uma cópia superficial (semelhante ao método Clone do´ArrayList) de um intervalo de elementos no objeto List. Nesse caso, o intervalo de elementos inclui todos os elementos.
Embora a correspondência não seja total em termos de recursos a substituição na maioria dos cenários vale a pena.
E estamos conversados.
"Eu sou o
Alfa e o Ômega, o princípio e o fim, diz o Senhor, que é, e que era, e que há de
vir, o Todo-Poderoso."
Apocalipse 1:8
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET