Ventajas y limitaciones de genéricos
Actualización: noviembre 2007
Al permitirle especificar los tipos concretos sobre los que actúa una clase o método genérico, la característica de genéricos traspasa la carga de la seguridad de tipos al compilador. No hay ninguna necesidad de escribir código para comprobar que el tipo de datos es correcto, porque esto se hace en tiempo de compilación. Se reduce la necesidad de convertir los tipos y la posibilidad de que se produzcan errores en tiempo de ejecución.
Los genéricos proporcionan seguridad de tipos sin el trabajo extra de realizar de varias implementaciones. Por ejemplo, puede crear una lista vinculada de cadenas con la siguiente declaración de variable:
Dim llist As New LinkedList(Of String)
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();
No hay necesidad de heredar de un tipo base y reemplazar los miembros. La lista vinculada está lista para su uso inmediato. Vea System.Collections.Generic y System.Collections.ObjectModel para conocer los tipos de colección genéricos proporcionados por .NET Framework.
Además de la seguridad de tipos, los tipos de colección genéricos suelen conseguir mejor rendimiento para almacenar y manipular tipos de valor porque no hay necesidad de realizar conversiones de los tipos de valor.
Los delegados genéricos habilitan las devoluciones de llamada con seguridad de tipos sin la necesidad de crear varias clases de delegado. Por ejemplo, el delegado genérico Predicate<T> le permite crear un método que implementa sus propios criterios de búsqueda para un tipo concreto y utilizar su método con métodos del tipo Array, como Find<T>, FindLast<T> y FindAll<T>.
Los delegados genéricos también se pueden utilizar en código generado dinámicamente sin que sea necesario generar un tipo de delegado. Esto aumenta el número de escenarios en los que puede utilizar métodos dinámicos ligeros en lugar de generar ensamblados completos. Para obtener más información, vea Cómo: Definir y ejecutar métodos dinámicos y DynamicMethod.
En muchos casos, los compiladores de Visual Basic, Visual C++ y C# pueden determinar a partir del contexto los tipos que se utilizan en una llamada de método genérico, lo que simplifica enormemente la sintaxis cuando se utilizan métodos genéricos. Por ejemplo, el código siguiente muestra las formas cortas y largas para llamar a la definición de método genérico BinarySearch para buscar en una matriz de cadenas. En la forma abreviada, los compiladores deducen el parámetro de tipo correcto a partir de los tipos de los argumentos de método.
Dim index As Integer = Array.BinarySearch(myArray, "test string")
Dim index As Integer = _
Array.BinarySearch(Of String)(myArray, "test string")
int index = Array.BinarySearch(myArray, "test string");
int index = Array.BinarySearch<string>(myArray, "test string");
int index = Array::BinarySearch(myArray, "test string");
int index = Array::BinarySearch<String^>(myArray, "test string");
Limitaciones de los genéricos
A continuación, se muestran algunas limitaciones que presentan los genéricos en .NET Framework versión 2.0:
Los tipos genéricos pueden derivarse de la mayoría de las clases base, como MarshalByRefObject (y pueden utilizarse restricciones para exigir que los parámetros de tipo genérico se deriven de clases base como MarshalByRefObject). Sin embargo, esta versión de .NET Framework no admite tipos genéricos enlazados a un contexto. Un tipo genérico puede derivarse de ContextBoundObject, pero si se intenta crear una instancia de ese tipo, se produce una excepción TypeLoadException.
Las enumeraciones no pueden tener parámetros de tipo genérico. Una enumeración sólo puede ser genérica de manera casual (por ejemplo porque está anidada en un tipo genérico que se define mediante Visual Basic, C# o C++). Para obtener más información, consulte Enumeraciones del sistema de tipos común.
Los métodos dinámicos ligeros no pueden ser genéricos. Para obtener más información sobre los métodos dinámicos, vea Escenarios del método dinámico Reflection Emit.
En Visual Basic, C# y C++, no pueden crearse instancias de un tipo anidado que esté incluido dentro de un tipo genérico, a menos que los tipos se hayan asignado a los parámetros de tipo de todos los tipos envolventes. En otras palabras, en la reflexión, un tipo anidado que se haya definido utilizando estos lenguajes incluye los parámetros de tipo de todos sus tipos envolventes. Esto permite que los parámetros de tipo de tipos envolventes se utilicen en las definiciones de miembro de un tipo anidado. Para obtener más información, vea "Tipos anidados" en MakeGenericType.
Nota: No es necesario que un tipo anidado definido mediante la emisión de código en un ensamblado dinámico o mediante Ensamblador de MSIL (Ilasm.exe) incluya los parámetros de tipo de sus tipos envolventes; sin embargo, si no lo hace, los parámetros de tipo no estarán en el ámbito de la clase anidada.
Para obtener más información, vea "Tipos anidados" en MakeGenericType.
Vea también
Conceptos
Información general sobre los genéricos de .NET Framework
Colecciones genéricas en .NET Framework
Delegados genéricos para manipular matrices y listas
Referencia
System.Collections.ObjectModel