Contenedores en C#
En esta lección aprenderás sobre el uso de contenedores en C#, tanto en su versión sin genéricos como con genéricos. Exploraremos las ventajas de los tipos genéricos en listas y clases, comparándolos con las estructuras tradicionales.
Recorrer una colección – sin genéricos
C# cuenta con la clase ArrayList
, que permite almacenar elementos sin especificar su tipo de dato. Sin embargo, esta aproximación puede llevar a problemas de conversión (casting
) y errores en tiempo de ejecución.
ArrayList arrayList = new ArrayList();
arrayList.Add("cow");
arrayList.Add("dog");
arrayList.Add("elephant");
foreach(var item in arrayList)
{
Console.WriteLine(item);
}
Genéricos
Los tipos genéricos se encuentran incluidos dentro de los caracteres <>. Especifican el tipo de datos que va a almacenar, utilizar o devolver una clase o método.
Genéricos en colecciones
Las listas genéricas (List<T>
) son más seguras y eficientes que ArrayList
, ya que garantizan que solo se almacenen elementos del tipo especificado.
List <Alumno> alumnos= new List<Alumno>();
alumnos.Add(new Alumno("Paco", 10));
alumnos.Add(new Alumno("Hachi", 80));
alumnos.Add(new Alumno("Pablo", 17));
foreach(Alumno item in alumnos){
Console.WriteLine(item.nombre);
}
✅ Ventajas de List<T>
sobre ArrayList
- No requiere conversiones de tipo (
casting
). - Mejora el rendimiento.
- Es más seguro y legible.
Notas
- No es necesaria la comprobación de tipos en tiempo de ejecución con lo cual reduce el uso de casting en el código.
- El código será menos ambiguo y más fácil de mantener.
Genéricos en clases
Los genéricos no solo se pueden utilizar en colecciones, sino también en clases, lo que permite definir estructuras reutilizables para distintos tipos de datos.
class GenericClass{
static void Main(string[] args){
Calculator<double> c = new Calculator<double>();
double r = c.Sum(2.0 , 2.0);
Console.WriteLine(r);
}
}
class Calculator<T> {
public T Sum<T>(T n1, T n2){
dynamic a = n1;
dynamic b = n2;
return a + b;
}
}
🔹 Explicación:
Calculator<T>
es una clase genérica que puede operar con distintos tipos (int
,double
, etc.).- Se usa
dynamic
para realizar operaciones sin importar el tipo de dato. - Permite reusar el código para distintos tipos sin duplicarlo.