Tag Archives: NO GENERICS

Generics – Teorias (Reuso)

Ex 1 : Reuse facilmente o código

Entendendo um pouco sobre Generics. Característica importante comparada aos tipos convencionais não Generics.

Um conceito importante para entender esse recurso é a questão de reuso de código. Vamos lá:

Já vimos que, ao implementar tipos byVal com classes collection no generics, temos as operações boxing/unboxing que aumentam a sobrecarga quando tipo byVal for convertido para byRef e vice-versa.

Utilizando classes genéricas, é possível defini-la apenas uma vez e instanciá-la de várias formas. Podemos inclusive, defini-la em uma linguagem .NET e utilizá-la em outra linguagem.

Chega de Teoria!

Instanciando objetos genericos

ClasseGenerica<int> objGen = new ClasseGenerica<int>();
objGen.Adicionar(4);

ClasseGenerica<string> objGen2 = new ClasseGenerica<string>();
objGen2.Adicionar("Developer");

ClasseGenerica<Pessoa> objGenP = new ClasseGenerica<Aluno>();
objGenP.Adicionar(new Pessoa { id = 4, nome = "Aldo" });

Instancio a classe ClasseGenerica<T> com tipo int e string.

Instancio utilizando um tipo definido pelo usuário como uma classe Pessoa.

Pronto! Agora tente realizar isso utilizando uma classe não genérica.

Generics – Teorias (Desempenho)

Ex 1 : Mais Desempenho

Entendendo um pouco sobre Generics. Característica importante comparada aos tipos convencionais (no Generics).

Um conceito importante para entender esse recurso é a questão de desempenho. Vamos lá:

Quando implementamos tipos byVal com classes collection não genéricas, temos as operações box/unbox que aumentam a sobrecarga quando tipo byVal for convertido para tipo byRef e vice-versa.

Chega de Teoria!

Exemplo simples

ArrayList oAL = new ArrayList();
            oAL.Add(4); 

            int x = (int)oAL[0];

            foreach (int i in oAL)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();

Para iniciar, crio uma instancia de ArrayList que irá armazenar itens como object.

Em seguida, incluo um valor com o Add() de tipo int. Ou seja, aqui o int sofre um box, e quando o valor for lido é feito o unbox. Convertendo tipo byVal para byRef.

Na linha seguinte e no WriteLine(i) também ocorrem unboxing.

ClasseGenerica<T>

Utilize a classe Genérica e defina T como tipo int:

ClasseGenerica<int>

Agora um int na classe é automaticamente gerado pelo compilador. Isso significa que as operações box/unbox não irão acontecer, e isto reflete em um desempenho melhorado.