Hecgo.com Just relax & enjoy

23Jul/060

Generics en el .NET Framework 2.0

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.

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

You must be logged in to post a comment.

No trackbacks yet.