Como debes saber C# es un lenguaje fuertemente tipado, esto implica que una vez la variable, clase o método es declarado con un tipo, siempre se comportará como tal. Como por ejemplo la siguiente variable: 

string unicorn = “8”;

La variable unicornio siempre será un tipo string y nunca va a ser un int por ejemplo. En algunos lenguajes, débilmente tipados, podrías hacer algo como esto:

unicorn = “8”

horse = unicorn + 8

//horse now is 16 

 

Esto puede sonar bien, pero puede hacer tu código difícil de entender a medida que tu aplicación vaya creciendo, es mucho más difícil de seguir todo en tu cabeza. Las buenas y malas noticias es que los lenguajes fuertemente tipados nos fuerzan a establecer explícitamente el comportamiento de su programa. Pero, ¿qué sucede cuando necesita diseñar clases y métodos que aplacen la especificación de uno o más tipos hasta que se declare y se cree una instancia de la clase o método?

 

Aquí es cuando los Genéricos salvan el día.

 

¿Cómo funcionan los Genéricos?

 

Los Genéricos permiten definir la especificaciones del tipo de una clase o método, hasta que sea utilizado en el programa. Los tipos de parámetros genéricos te permiten crear có type-safe

Los métodos y clases genéricas combinan la reutilización del código y mejoras en el rendimiento. La mayor parte del tiempo los genéricos son utilizados con “Collections”y métodos que operan con ellas.  El uso de genéricos nos ayuda a evitar problemas de casteo constante y  boxing.

Un tipo genérico es declarado especificando un tipo de parámetro con corchetes angulares “<>” donde Typename<T> where T es un tipo de parámetro. No es obligatorio colocar a «T» como el tipo genérico en la definición.Puedes usar cualquier letra para la declaración de la clase TestClass<>. 

public class TestClass<T> { }  

El namespace System.Collection.Generic define el número de clases que implementan algunas de estas interfaces. Tal como se puede ver en esta tabla:

 

Generic class Description
Collection<T> The basis for a generic collection Comparer compares two generic objects for equality
Dictionary<TKey, TValue> A generic collection of name/value pairs
List<T> A dynamically resizable list of Items
Queue<T> A generic implementation of a first-in, first-out (FIFO) list
Stack<T> A generic implementation of a last-in, first-out (LIFO) list

 

Un ejemplo sencillo de una clase genérica sería:

 

Características de Genéricos:

El uso de Genéricos es una técnica que enriquece tus aplicaciones de las siguientes maneras: 

  1. Le ayuda a maximizar la reutilización del código, la seguridad de los tipos y el rendimiento.
  2. Puede crear clases de colecciones genéricas. La biblioteca de clases de .NET Framework contiene varias clases de colección genéricas nuevas en el namespace System.Collections.Generic
  3. Puede crear sus propias interfaces genéricas, clases, métodos, eventos y delegados.

 

Hay algunas pautas o buenas prácticas que debe tener en cuenta al trabajar con genéricos, especialmente a la hora de nombrar tus genéricos:

Como mencioné antes, podemos crear métodos genéricos con un parámetro de tipo «T». El código siguiente muestra este concepto:

 

En resumen: 

  • Use tipos genéricos para maximizar la reutilización del código, la seguridad de tipos y el rendimiento.
  • El uso más común de genéricos es crear clases de colección.
  • La biblioteca de clases .NET contiene varias clases de colección genéricas en el espacio de nombres System.Collections.Generic. Estos se deben usar siempre que sea posible en lugar de clases como ArrayList en el System.Collections espacio de nombres.
  • Puede crear sus propias interfaces genéricas, clases, métodos, eventos y delegados
Referencias:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-type-parameters?WT.mc_id=DT-MVP-5003575

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/?WT.mc_id=DT-MVP-5003575