Generics en C#: para qué sirven y cómo usarlos
\n\nAl desarrollar en C#, tarde o temprano todos se encuentran con una situación en la que el mismo algoritmo debe aplicarse a diferentes tipos de datos. Antes, para esto había que escribir varias versiones de un mismo método o usar el tipo object, lo que provocaba pérdida de rendimiento y riesgo de errores. La solución a este problema son los Generics (tipos genéricos). En este artículo analizaremos qué son los generics, para qué sirven y cómo usarlos correctamente en C#.
¿Qué son los Generics en C#?
\n\nLos Generics (genéricos) son un mecanismo del lenguaje C# que permite crear clases, métodos, interfaces y delegados que trabajan con diferentes tipos de datos sin perder la tipificación estricta. En lugar de escribir código para cada tipo por separado, creas una plantilla universal que sustituye el tipo necesario durante la compilación.
\n\nImagina que necesitas escribir un método para intercambiar los valores de dos variables. Sin generics, tendrías que crear métodos separados para int, string, double, etc. Con generics, escribes un solo método que funciona con cualquier tipo.
Aquí tienes un ejemplo muy simple de declaración de un método genérico:
\n\npublic void Swap<T>(ref T a, ref T b)\n{\n T temp = a;\n a = b;\n b = temp;\n}\n\nAquí, <T> es el parámetro de tipo. La letra T es una notación común (de Type), pero puedes usar cualquier nombre. Cuando llamas al método, especificas el tipo concreto:
int x = 5, y = 10;\nSwap<int>(ref x, ref y);\n// Ahora x = 10, y = 5\n\nstring first = "Hola", second = "Mundo";\nSwap<string>(ref first, ref second);\n// Ahora first = "Mundo", second = "Hola"\n\n¿Para qué sirven los Generics? Principales ventajas
\n\nEl uso de generics ofrece varias ventajas importantes que hacen que el código sea mejor y más seguro.
\n\n1. Seguridad de tipos (Type Safety)
\nA diferencia del uso de object, los generics verifican los tipos en tiempo de compilación. No podrás pasar accidentalmente una cadena donde se espera un número. El compilador señalará el error de inmediato.
2. Rendimiento
\nAl usar object, se produce el empaquetado (boxing) de tipos de valor (int, double, struct) en un tipo de referencia y el desempaquetado inverso (unboxing). Estas son operaciones costosas. Los generics eliminan por completo estos procesos, ya que el compilador genera código especializado para cada tipo.
3. Reutilización del código
\nNo necesitas escribir el mismo algoritmo para diferentes tipos. Una sola clase o método genérico puede funcionar con miles de tipos diferentes.
\n\n4. Legibilidad y mantenibilidad
\nEl código se vuelve más limpio y comprensible. Ves claramente con qué tipos trabaja el método o la clase, y la lógica está separada de los tipos de datos concretos.
\n\nCómo usar Generics: ejemplos prácticos
\n\nVeamos algunos escenarios reales de uso de generics en C#.
\n\nClases genéricas
\nEl ejemplo más común son las colecciones. En lugar de crear tu propia clase para almacenar una lista de números, cadenas u objetos personalizados, usas List<T>:
List<int> numeros = new List<int>();\nnumeros.Add(1);\nnumeros.Add(2);\n\nList<string> nombres = new List<string>();\nnombres.Add("Alicia");\nnombres.Add("Roberto");\n\n// Tu propia clase genérica\npublic class Repositorio<T>\n{\n private List<T> _items = new List<T>();\n\n public void Agregar(T item) => _items.Add(item);\n public T Obtener(int indice) => _items[indice];\n}\n\nRepositorio<int> repoInt = new Repositorio<int>();\nrepoInt.Agregar(100);\nint valor = repoInt.Obtener(0); // 100\n\nMétodos genéricos
\nLos métodos pueden ser genéricos incluso dentro de clases normales:
\n