Uno de los nuevos conceptos del .NET Framework 2.0 es el de Generics.

Generics es una característica del CLR que permite declarar clases, estructuras, interfaces y métodos sin especificar en tiempo de compilación los tipo de dato que almacenan o utilizan, y especificando en su lugar parámetros “genéricos”. Los tipos reales de los datos se especifican cuando el tipo genérico es utilizado y no cuando es declarado, permitiendo definirlo una única vez y utilizarlo muchas veces con parámetros de distinto tipo.

Generics está soportado directamente por el CLR, aunque sólo se puede hacer uso de esta característica desde los lenguajes VB.NET, C# y C++ .NET.

En otras palabras:

Declaramos una clase genérica:

C#:
  1. public class ClaseGenerica
  2. {
  3. public T Atributo;
  4. }

Instancia de la clase genérica (en este caso será un string):

C#:
  1. ClaseGenerica g = new ClaseGenerica();
  2. g.Atributo = “Hola”;
  3. g.Atributo = 2; //Esto genera un error de compilación…

… o mejor un entero?

C#:
  1. ClaseGenerica g = new ClaseGenerica();
  2. g.Atributo = 2;

El poder de los Generics está en usarlos, por ejemplo, para crear Colecciones Genéricas, he aquí un ejemplo real:

Sin Generics:

C#:
  1. System.Collections.ArrayList lista = new System.Collections.ArrayList();
  2. lista.Add(“Hola”); //Como se agrega un System.Object podemos agregar un string…
  3. lista.Add(2); // o un entero, no hay error de compilación
  4. for (int i = 0; i <lista.Count; i++)
  5. {
  6. //pero es necesario hacer el casting del tipo que contiene la lista al usarlo:
  7. System.Console.Write((string) lista[i]);
  8. //en este ejemplo, se generará una exepción, al intentar hacer casting de un entero…
  9. }

Aplicando Generics:

C#:
  1. System.Collections.Generic.List lista = new System.Collections.Generic.List();
  2. lista.Add(“Hola”); //Se recibe directamente un string en vez de un Object, ya que así se indico al instanciar…
  3. lista.Add(2); //esto provoca un error de compilación, ya que nuestra instancia solo acepta strings…
  4. for (int i = 0; i <lista.Count; i++)
  5. {
  6. System.Console.Write(lista[i]);
  7. //No es necesario hacer casting!!!
  8. }

En conclusión, las principales ventajas de usar Generics, son en performance y validación en tiempo de compilación.

Performance porque se evitan las operaciones de casting y boxing/unboxing necesarias para insertar y obtener elementos de colecciones no genéricas. Además, los elementos son almacenados directamente en el tipo que específica la instancia (int y string en los ejemplos anteriores) y no instancias completas de System.Object.

Y la validación en tiempo de compilación asegura un código con menos errores.