¿Que son los Genericos o Generic?

Publicado: julio 18, 2007 en DCE 2005, Desarrollo, Frameworks, Generic, Lenguajes de programacion, Microsoft.NET, Programación, Visual Studio 2005

La version de C# 2.0 permite especificar los tipos utilizados en las definiciones de otros tipos de datos y de métodos de forma parametrizada, de manera que en vez de indicarse exactamente cuáles son se coloque en su lugar un párametro -parámetro tipo- que se concretrará en el momento en que se vaya a usar (al crear un objeto de la clase, llamar al método,…). A esta definicion se les llama genéricos o geniric(en inglés), y un ejemplo de una de ellas es la siguiente:

public class A <T>

{

T valor;

public void EstablecerValor(T valor)

{

this.valor = valor

}

}

En esta clase no se han concretado ni el tipo del campo privado valor ni el del único parámetro del método EstablecerValor(). En su lugar se le ha especificado un parámetro tipo T que se concretará al utilizar la clase. Por ejemplo, al crear un objeto suyo.

A<int> obj = new A<int> ();

Esto crearía un objeto de la clase genérica A con el parámetro tipo T concretizando con el argumento tipo int. La primera vez que el CLR encuentre esta concretización de T a int realizará un proceso de expansión o instrucción del genéro consistente en generar una nueva clase con el resultado de sustituir en la definicion génerica toda aparición de los parámetros tipos por los argumentos tipo. Para el ejemplo anterior esta clase sería:

public class A <int>

{

int valor;

public void EstablecerValor(int valor)

{

this.valor = valor;

}

}

A los tipos con parámetros tipo, como A<T>, se les llama tipos genéricos cerrados; a los generados al concentrárseles algún parámetro tipo se le llama tipos construidos; y a los generados al concentrárseles todos tipos génericos abiertos. La relación establecida entre ellos es similar a la establecida entre las clases normales y los objetos: al igual que las clases sirven de plantillas en base a las que creamos objetos, los tipos genéricos cerrados actúan como plantillas en base a las que creamos tipos genéricos abiertos. En C++ se llamaba plantillas a las construcciones equivalentes a los genéricos.

La expansión la hace el CLR en tiempo de ejecución, a diferencia de lo que sucede en otros entornos (pc, C++) en los que se realiza al compilar. Por lo que con esto tenemos unas ventajillas :

Ensamblados más pequeños. Como sólo almacenan el tipo genérico cerrado, que el CLR ya expandirá en tiempo de ejecución, su tamaño es más pequeño y se evita el problema del excesivo inflado del código binario generado. para evitar ese inflado de la memoria consumida el CLR reutiliza gran parte del MSIL generado para la primera expansión de un genérico por un tipo referencia (recuerda una referencia al fin y al cabo punteros en memoria se representan igual).

Quede claro su principal utilidad es, como su propio nombre indica, facilitar la creacion de código genérico que pueda trabajar con datos de cualquier tipo. Esto es especificamente útil para crear tipos que actúen como colecciones (pilas, colas, listas, entre otros), cosa que C# 1.0 o 1.1 sólo permitía crear definiéndolos en base a la clase base común object.

Ejemplo:

using System;
using System.Collections.Generic;

namespace colecciones

{

class Program

{

static void Main(string[] args)

{

Queue <int> cola = new Queue <int>();

int opc;

do

{

Console.Clear();

Console.WriteLine(“1.- Insertar”);

Console.WriteLine(“2.- Eliminar “);

Console.WriteLine(“3.- Mostrar”);

Console.WriteLine(“4.- Salir”);

opc = int.Parse(Console.ReadLine());

switch (opc)

{

case 1:

Insertar(cola);
break;

case 2:
Eliminar(cola);
break;

case 3:
Mostrar(cola);
break;

}

} while (opc != 4);

Console.ReadLine();

}

private static void Eliminar(Queue <int> cola)
{

cola.Dequeue();

}

private static void Mostrar(Queue <int> cola)
{

Console.Clear();

foreach (int numero in cola)

{
Console.WriteLine(numero);
}

Console.ReadLine();

}

private static void Insertar(Queue <int> cola)
{

Console.WriteLine(“dame dato”);
int dato = int.Parse(Console.ReadLine());
cola.Enqueue(dato);
}

}

}

comentarios
  1. manuel dice:

    muy buen aporte
    pero podris poner mensajes cuando la cola este vacia
    por ejemplo en el de eliminar
    y en el de buscar
    te lo agradeceria de por vida
    y sobre pilas no sabes algo parecido

  2. andrea dice:

    pues… aún no dices qué son los generics -_-

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