Genéricos

Los genéricos es un concepto que aparece en la versión 2.0 del Framework .Net y lo explico en todos los cursos que imparto porque ha tomado más y más importancia con las siguientes versiones del framework.

Una clase, o método o interface es genérica cuando el tipo es independiente de la implementación.

Los problemas sin genéricos

Para entender mejor el problema utilizamos listas como Stack que se encuentra dentro del espacio de nombres System.Collections.

Sin los genéricos el tipo object es el que utilizamos para indicar que una de estas lista puede contener cualquier tipo. Pero muchas veces las listas, cuando las estamos utilizando, son de un solo tipo. Lista de enteros, lista de strings, lista de Personas,….

Boxing/Unboxing: Es el nombre que tiene cuando un tipo debe reconvertirse en otro en tiempo de ejecución. Esto es lo que nos pasa en las listas sin genéricos.

//boxing
s.Push( 10 );
//unboxing
int i = (int)s.Pop();

Existe aún otro problema denominado No Type safety. Significa que nuestra lista puede contener cualquier tipo de datos y se escapa de nuestro control, en tiempo de compilación, de cualquier error producido por un programador.

//No type safety
Stack s = new Stack();
s.Push( 10 );
s.Push( "Hello" );

 

La solución de los Genéricos

Si continuamos hablando de listas, estas se encuentran en el espacio de nombre System.Collections.Generic.

Crear una clase genérica implica indicar un tipo, el tipo no sabemos cual va a ser ya que se indicará en el momento de utilizar nuestra clase genérica, por tanto debemos dar un nombre a ese tipo, normalmente se usa T.

public class Stack<T> {
 …
 public void Push( T item ) { ... }
 public T Pop() { ... }
}

El tipo T se substituye en tiempo de compilación por el tipo que indicamos en la declaración.

Stack<int> s = new Stack<int>();
s.Push( 10 );
s.Push( 20 );
int i = s.Pop();

De este modo tenemos solucionado el No Type Safety, el Boxing y el Unboxing ya que es el compilador quien comprobará que el tipo que insertamos en nuestra pila sea el mismo tipo en el que hemos declarado nuestro Stack genérico.

//Error de compilación
s.Push( “Hello” )

En el siguiente ejemplo te muestro como podemos utilizar la T en toda la clase:

public class Stack<T> : IEnumerable<T> {
 private List dataItems = new List();
 
 public void Push( T item ) 
 { 
  dataItems.Insert( 0, item ); 
 }
 
 public T Pop() { 
  T retVal = dataItems[0];
  dataItems.RemoveAt(0);
  return retVal;
 }
}

Conclusión

Los genéricos es un concepto introducido en la versión 2.0 del .Net Framework que sirven para desacoplar el tipo de la implementación. Mi recomendación es que empieces a utilizar las listas genéricas que encontrarás en el espacio de nombres System.Collections.Generic. Mejora en rendimiento y en robustez tus aplicaciones con los genéricos.

Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

S'està connectant a %s