Introdução – Generic é uma maneira de criar parâmetros para classes e definir tipos que podem ser substituídos em vários lugares do programa. Isso elimina o uso da classe Object para definirmos tipos que podem variar no decorrer do programa.

 Por exemplo, vamos imaginar uma classe com um método que possa receber uma string, int ou decimal como parâmetro. A única maneira de criar uma única função deste tipo seria criar uma que recebesse um Object, já que o Object pode ser de qualquer tipo. Na hora de recuperarmos o valor, o programa deveria fazer uma conversão correta em tempo de execução (operação chamada Cast) e, caso o tipo contido no retorno da função não fosse o correto, certamente teríamos um erro. Veja o exemplo a seguir:

class GenericTest<Type>

        {

            public Type[] Test(int number)

            {

                Type[] objArray = new Type[number];

                return objArray;

            }

        }

  Esta classe tem um método que retorna um array de qualquer tipo. O tipo é definido em tempo de execução, conforme veremos no exemplo abaixo, que cria duas instâncias da classe com diferentes tipos sendo retornados. Note que o tipo é resolvido em tempo de compilação e não em tempo de execução:

GenericTest<int> objInteger = new GenericTest<int>();

            int[] integerValues = objInteger.Test(100);

 

            GenericTest<string> objString = new GenericTest<string>();

            string[] stringValues = objString.Test(100);

 Os Generics existem desde o .NET Framework 2.0, e foram adicionados à ele por diversos motivos, entre eles:

·         Eliminar a necessidade de casting;

·         Melhorar a segurança de tipos;

·         Reduzir a quantidade de boxing solicitada;

·         Facilitar a criação de métodos e classes generalizadas.

 A grande utilidade dos genéricos é em relação a coleções. Até a versão 1.1 do .NET Framework, a classe ArrayList era usada para criar coleções de objetos. Não era possível criarmos uma coleção de strings, por exemplo. Já o Class Library do .NET Framework 2.0 contém versões genéricas de várias das classes de coleção e interfaces no namespace System.Collections.Generic.

 A classe List<> serve para criar coleções de diversos tipos e pode substituir a classe ArrayList na maioria dos casos. A sintaxe para criar uma coleção de strings, por exemplo, é a seguinte:

List<string> names = new List<string>();

 

            //Lembrando que após declaramos essa lista, devemos adicionar

            //SOMENTE strings, assim como só strings serão retornadas

            names.Add("Wellington");

            names.Add("Joana");

            names.Add("Marcos");

            names.Add("Juliana");

 

            //Para recuperarmos valores da lista usamos o laço Foreach

            foreach (string name in names)

            {

                MessageBox.Show(name);

            }

 Tipos Generics – Podemos dizer que Generics são tipos com parâmetros. Com relação a eles, podemos defini-los como sendo proprietários do local para futuros tipos. Apesar de os tipos generics incluírem classes, estruturas e interfaces, o significado do tipo permanece. Confira na classe a seguir:

class ListExample<T>

        {

            public ArrayList objArrayList = new ArrayList();

 

            public void Insert(T item)

            {

                objArrayList.Add(item);

            }

        }

 Perceba que o T (de Type = Tipo) apenas será definido pelo objeto que usar a classe, assim:

ListExample<int> numbers = new ListExample<int>();

            numbers.Insert(50);

            numbers.Insert(100);

            numbers.Insert(150);

 Uma classe, mesmo ela sendo genérica, permanece ainda uma classe. Isso acontece porque se trata apenas de uma classe com parâmetros de tipo.

 A respeito da localização de parâmetros, esta se dá depois do cabeçalho da classe, sendo eles colocados entre os sinais de menor e maior “< e >”. Ainda falando dos parâmetros de tipo, eles são acessíveis à declaração de classe, ao cabeçalho, ao corpo e às constraints.

 O simples fato de as coleções serem tipicamente de propósito geral faz com que os generics sejam ideais para a implementação de coleções.

 O .NET contém diversas listas genéricas, como o List, Dictionary, Queue, etc. Algumas destas vocês podem conferir duas séries de artigos que fiz sobre Arrays e Coleções, não percam!

 Fonte de Consulta: Apostila de C#, da Impacta Tecnologia.

 Assim finalizo o artigo. Muito obrigado a todos!

 Um abraço, e até o próximo artigo.

 Wellington Balbo de Camargo

 wellingtonbalbo@gmail.com