Clases genéricas
Tipos de contenedor reutilizables
Clases genéricas es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
¿Qué es una clase genérica?
Una clase genérica declara uno o varios parámetros de tipo entre corchetes angulares después del nombre de la clase. Esos parámetros se pueden usar para campos, propiedades, firmas de métodos y tipos de retorno en toda la clase.
Esto permite escribir un único contenedor o servicio que funcione con muchos tipos de elementos y conserve la tipificación fuerte.
class Box<T>
{
public T Value { get; set; }
}Construir una clase genérica
Para crear una instancia, se proporciona un argumento de tipo concreto. Box<int> y Box<string> son tipos construidos distintos.
Cada tipo construido se comporta como si su T se hubiera reemplazado por el tipo real en todas partes.
using System;
class Box<T> { public T Value { get; set; } }
class Program
{
static void Main()
{
var b = new Box<int> { Value = 7 };
Console.WriteLine(b.Value);
}
}Campos y propiedades genéricos
Los parámetros de tipo se pueden usar como tipo de campos y propiedades. Una pila, una cola o una caché suelen almacenar sus datos en una matriz o lista de T.
El almacenamiento interno mantiene la seguridad de tipos sin conversiones.
class Pair<T>
{
public T First;
public T Second;
}Varios parámetros de tipo
Una clase puede aceptar varios parámetros de tipo. Los tipos que representan pares de clave y valor o diccionarios suelen usar dos.
Los nombres descriptivos, como TKey y TValue, mejoran la legibilidad cuando hay más de uno.
class Entry<TKey, TValue>
{
public TKey Key { get; set; }
public TValue Value { get; set; }
}Una pila genérica sencilla
A continuación se muestra una pila genérica pequeña basada en una List<T>. Push agrega un elemento al final y Pop lo elimina del final.
La misma clase sirve para enteros, cadenas o cualquier tipo por referencia o por valor.
using System;
using System.Collections.Generic;
class MyStack<T>
{
private readonly List<T> items = new();
public void Push(T item) => items.Add(item);
public T Pop()
{
var i = items[^1];
items.RemoveAt(items.Count - 1);
return i;
}
}
class Program
{
static void Main()
{
var s = new MyStack<string>();
s.Push("a");
s.Push("b");
Console.WriteLine(s.Pop());
}
}Métodos genéricos dentro de clases genéricas
Una clase genérica también puede declarar parámetros de tipo adicionales en métodos individuales. Esos parámetros del método son independientes de los parámetros de la clase.
Esto aporta flexibilidad, por ejemplo, al convertir el tipo almacenado en otro tipo.
class Box<T>
{
public T Value;
public TOut Map<TOut>(Func<T, TOut> f) => f(Value);
}Restricciones de la clase
Al igual que los métodos, una clase genérica puede restringir sus parámetros de tipo con where. Una restricción se aplica a todos los miembros que usan ese parámetro.
En el ejemplo siguiente, where T : class permite asignar null y realizar comparaciones de referencias.
class Repository<T> where T : class
{
private T current;
public bool IsEmpty => current is null;
}Los miembros estáticos son independientes para cada tipo
Cada tipo genérico construido obtiene su propia copia de los campos estáticos. Counter<int> y Counter<string> mantienen contadores independientes.
Esta es una diferencia sutil, pero importante, respecto de las clases no genéricas.
class Counter<T>
{
public static int Count;
}Valores predeterminados en clases genéricas
Dentro de una clase genérica, a menudo se necesita un valor inicial para un campo de tipo T. Use default(T) o la forma abreviada default cuando el tipo se conozca por el contexto.
Produce null para los tipos por referencia y el valor cero para los tipos por valor.
class Slot<T>
{
public T Value = default!;
public bool HasValue { get; private set; }
}Heredar de una clase genérica
Se puede derivar una clase de una clase base genérica. La subclase puede fijar el argumento de tipo o seguir siendo genérica.
Fijarlo especializa la clase base; mantenerla genérica transmite el parámetro hacia arriba.
class Box<T> { public T Value; }
class IntBox : Box<int> { }
class NamedBox<T> : Box<T> { public string Name; }Genéricos y las colecciones integradas
La biblioteca base de .NET está repleta de clases genéricas: List<T>, Dictionary<TKey, TValue> y Queue<T>. Son el beneficio práctico cotidiano del diseño de clases genéricas.
Escribir sus propios tipos genéricos permite ampliar ese mismo estilo seguro y reutilizable.
using System.Collections.Generic;
var scores = new Dictionary<string, int>();
scores["ada"] = 95;Comprobación rápida
Compruebe su comprensión de las clases genéricas.
Resumen
Las clases genéricas declaran parámetros de tipo después del nombre de la clase y los usan para campos, propiedades y métodos. Se construyen con argumentos de tipo concretos, lo que crea tipos distintos.
Pueden añadir parámetros de tipo en los métodos, incluir restricciones where, heredarse y mantener estado estático independiente para cada tipo. Las colecciones integradas son el ejemplo principal.
Preguntas frecuentes
¿La lección «Clases genéricas» es gratis?
Sí — el texto completo de «Clases genéricas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Clases genéricas»?
Tipos de contenedor reutilizables Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Clases genéricas»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Métodos genéricos
- Clases genéricas
- Restricciones where
- Interfaces genéricas