Generics - Parte I

Neste artigo estarei abortando duas grandes novidades no .NET Framework 2.0, Generics e algumas API´s genéricas.

Generics - Parte I

 

Neste artigo estarei abordando duas grandes novidades no .NET Framework 2.0, Generics e algumas API´s genéricas. Este conceito de Generics é muito podero, na verdade não é uma novidade, já tinhamos este conceito em C++, que são conhecidos por Templates. Na versão 5 do Java também temos generics, mas uma diferença é que em .NET temos classes nativas em generics ganhando performance com isso.

 

Um dos cenários típos da utilização de generics são coleções tipadas. Nas versões anteriores do .NET Framework não existia generics, com isso, várias coleções eram declaradas com o tipo object, para que não houvessem problemas com sua manipulação, entretando, perdíamos na performance pois utilizando object nas coleções teríamos que utilizar vários conversões para os tipos que estivéssemos precisando e não tínhamos flexibilidade.

 

Para demonstrar este problema irei utilizar o exemplo clássico de generics.

 

 

 

No código temos um object pilha que é instanciado da class Stack. Depois de adicionar dois elementos inteiros nesta pilha, queremos retornar o elemento do topo da pilha, porém, o método Pop() retorna um object. Com isso temos que utilizar um cast para retornar um inteiro da pilha. A mesma coisa iria acontecer se estivessemos adicionando valores reais na pilha e depois retirando, um cast é sempre necessário.

 

Fica bem claro que este fato gera alguns problemas como performance prejudica, por causa de casts constantes e problemas com a usabilidade da API. No modelo que tínhamos com o .NET Framework 1.x, era necessário saber quais tipos existiam na pilha antes de manipular a pilha.

 

Com o .NET Framework 2.0 algumas coisas mudam. Foram criadas novas classes de coleções utilizando generics. Estas novas classes se encontram no namespace system.Collections.Generics.

 

Cada coleção deste namespace possui um parâmetro de tipo. Este parâmetro de tipo especifica o type que se deseja inserir na coleção. Por convenção utilizamos a letra "T" para simbolizar este tipo que irá trafegar pela coleção. Tirando este detalhe do parâmtro, iremos manipulas as classes genéricas da mesma maneira que utilizamos as classes não genéricas.

 

Usando um classe genéria, esta classe se torna fortemente tipada consequentemente não teremos mais problemas com performance por não será mais necessário utilizar casts o tempo todo.

 

Veja no exemplo a seguir o que como foi a mudança.

 

Antes de Generics

 

Class Stack

{

  public object Pop()

  {...}

  ....

{}

 

Depois de Generics

 

Class Stack<T>

{  

   public T Pop()

   {

....

   }

}

 

Como podemos ver introduzimos um parâmetro T na classe Stack e este mesmo T será o nosso tipo de retorno do método Pop. Com isso ganhamos uma certa flexibilidade, pois podemos definir este parámetro T com qualquer tipo. Iremos ver um exemplo prático desta classe:

 

 

 

Bom pessoal, esta foi uma pequena introdução sobre Generics, aguardem as outras partes deste artigo, pois temos muita coisa para ver com Generics.

 

Links

http://msdn.microsoft.com/vcsharp/

Artigos relacionados