[.NET] Qué son los Generics y su implementación en C# (I).


Desde la versión 2.0 del .NET Framework tenemos soporte para Generics. Con Generics se pueden crear clases o métodos que son independientes de su tipo contenido. En vez de escribir métodos o clases con la misma funcionalidad para diferentes tipos, se puede crear únicamente un método o una clase para ello.

Otra opción para reducir nuestro código es el uso de la clase Object. Sin embargo el problema de emplear dicha clase es que no es type-safe, es decir no se hace comprobación de tipos. Las clases genéricas hacen uso de tipos genéricos que son reemplazados por tipos específicos cuando se requiera. Esto permite la comprobación de tipos durante la compilación.

Los generics no sólo se pueden usar en clases sino también se pueden emplear en métodos, interfaces, delegados, etc.

Algunas ventajas del empleo de Generics son:

  • Rendimiento.
  • Seguridad de tipos.
  • Reutilización de código.

Rendimiento

El uso de Value types en una colección de clases tiene como resultado una conversión boxing y unboxing de los Value type cuando se convierten en tipos Reference type y viceversa.

Boxing y Unboxing

Boxing-unboxing

Los Value types se almacenan en el Stack, los Reference types se almacenan en el Heap. .NET facilita la conversión de los tipos por valor a tipos por referencia por lo que puedes usar un tipo por valor como si fuera un Object cuando se requiera. La conversión de un tipo por valor a un tipo por referencia se denomina Boxing. Cuando un tipo por referencia se convierte a un tipo por valor se denomina Unboxing.

Cuando se realiza este tipo de conversión en colecciones con muchos elementos puede provocar una pérdida de rendimiento, por lo que el empleo de Generics, al pasarle el tipo como parámetro, se evita tener que realizar el boxing y el unboxing.

Seguridad de tipos

Otra característica de los generics es su seguridad de tipos.

Si por ejemplo tenemos lo siguiente:


var list = new ArrayList();

list.Add(23);
list.Add("una cadena");
list.Add(new MiClase());

Podemos observar que en el ArrayList tenemos un entero, una cadena y un objeto. Ahora bien si intentamos iterar sobre la colección obtendremos una bonita excepción en tiempo de ejecución.


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

Usando genéricos podemos detectar en tiempo de compilación los posibles errores.


var list = new List<int>();

list.Add(23);
list.Add("mi cadena"); // ERROR EN TIEMPO DE COMPILACIÓN !!
list.Add(new MiClase()); // ERROR EN TIEMPO DE COMPILACIÓN !!

Como vemos el compilador hace una comprobación de los tipos y nos avisa.

Reutilización de código

Una clase genérica se define una única vez y se puede reutilizar con cualquier tipo. Un ejemplo básico es el de la clase List del espacio de nombres System.Collections.Generic que se puede instanciar como una lista de enteros, de cadenas o de clases:


var list = new List<int>();
list.Add(23);

var stringList = new List<string>();
stringList.Add("mi cadena");

var miClaseList = new List<MiClase>();
miClaseList.Add(new MiClase());

En el siguiente post veremos cómo implementar en C# clases, métodos, interfaces y delegados genéricos y alguna de sus características.

Anuncios

3 comentarios en “[.NET] Qué son los Generics y su implementación en C# (I).

    1. Hola satya, como bien sabes no hace falta traducir la MSDN. Si cambias en-us por es-es ya te sale traducido. Y sale traducido porque mucha gente y yo también colaboramos con la comunidad. Te comento que soy moderador de la Translation Wiki en español.
      Si te fijas en otras entradas , que incluyo la referencia a MSDN por ejemplo; este post no está terminado por lo que no lo incluí. También decirte que sobre Generics se han escrito muuuuucho en libros, en MSDN, etc. No es original lo sé, llevan como 10 años en la plataforma .NET por lo que escribamos lo que escribamos seguro otra persona los habrá escrito antes.
      Lo que por ahora pretendo es resumir desde cero la programación en C# y sus características. Ahora te traslado una pregunta… ¿Cómo explicarías tú los generics?
      Muchas gracias y un saludo

      Le gusta a 1 persona

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s