Información general sobre los genéricos de .NET Framework

Actualización: noviembre 2007

En este tema se proporciona información general sobre los genéricos en .NET Framework y un resumen de los métodos o los tipos genéricos. También se define la terminología que se utiliza para explicar los genéricos.

Definir y utilizar genéricos

Los genéricos son clases, estructuras, interfaces y métodos que tienen marcadores de posición (parámetros de tipo) para uno o varios de los tipos que almacenan o utilizan. Una clase de una colección genérica podría usar un parámetro de tipo como marcador de posición para el tipo de objetos que almacena; los parámetros de tipo aparecen como los tipos de sus campos y los tipos de parámetros de sus métodos. Un método genérico podría usar su parámetro de tipo como el tipo de su valor devuelto o como el tipo de uno de sus parámetros formales. El código siguiente muestra una definición de clase genérica simple.

Public Class Generic(Of T)
    Public Field As T
End Class
public class Generic<T> 
{
    public T Field;
}
generic<typename T> public ref class Generic 
{
public:
    T Field;
};

Cuando crea una instancia de una clase genérica, especifica los tipos reales que sustituir para los parámetros de tipo. Así se establece una nueva clase genérica, llamada clase genérica construida, con sus tipos elegidos sustituidos en todas las apariciones de los parámetros de tipo. El resultado es una clase con seguridad de tipos que se adapta a su elección de tipos, como se ilustra en el código siguiente.

Dim g As New Generic(Of String)
g.Field = "A string"
Generic<string> g = new Generic<string>();
g.Field = "A string";
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";

Terminología de los genéricos

Los términos que se incluyen a continuación se utilizan para explicar los genéricos en .NET Framework:

  • Una definición de tipo genérico es una declaración de interfaz, clase o estructura que funciona como una plantilla, con marcadores de posición para los tipos que puede contener o utilizar. Por ejemplo, la clase Dictionary<TKey, TValue> puede contener dos tipos: claves y valores. Dado que es sólo una plantilla, no puede crear instancias de una clase, estructura o interfaz que es una definición de tipo genérico.

  • Los parámetros de tipo genéricos, o parámetros de tipo, son los marcadores de posición de un tipo genérico o definición de método. El tipo genérico Dictionary<TKey, TValue> tiene dos parámetros de tipo, TKey y TValue, que representan los tipos de sus claves y valores.

  • Un tipo genérico construido, o tipo construido, es el resultado de especificar los tipos para los parámetros de tipo genérico de una definición de tipo genérico.

  • Un argumento de tipo genérico es cualquier tipo que se sustituye para un parámetro de tipo genérico.

  • El término general "tipo genérico" incluye tanto los tipos construidos como las definiciones de tipos genéricos.

  • Las restricciones son límites colocados en parámetros de tipo genérico. Por ejemplo, podría limitar un parámetro de tipo a los tipos que implementa la interfaz genérica IComparer<T> para garantizar que se pueden ordenar esas instancias del tipo. También puede restringir los parámetros de tipo a los tipos que tienen una clase base concreta, que tienen un constructor predeterminado o que son tipos de referencia o tipos de valor. Los usuarios del tipo genérico no pueden sustituir los argumentos de tipo que no cumplen las restricciones.

  • Una definición de método genérico es un método con dos listas de parámetros: una lista de parámetros de tipo genérico y una lista de parámetros formales. Los parámetros de tipo pueden aparecer como el tipo de valor devuelto o como los tipos de los parámetros formales, tal y como se muestra en el código siguiente.

    Function Generic(Of T)(ByVal arg As T) As T
        Dim temp As T = arg
        ...
    End Function
    
    T Generic<T>(T arg) { T temp = arg; ...}
    
    generic<typename T> T Generic(T arg) { T temp = arg; ...};
    

    Los métodos genéricos pueden aparecer en tipos genéricos o no genéricos. Es importante señalar que un método no es genérico sólo porque pertenezca a un tipo genérico, o incluso porque tenga parámetros formales cuyos tipos son los parámetros genéricos del tipo que los envuelve. Un método sólo es genérico si tiene su propia lista de parámetros de tipo. En el código siguiente, sólo el método G es genérico.

    Class A
        Function G(Of T)(ByVal arg As T) As T
            ...
        End Function
    End Class
    Class Generic(Of T)
        Function M(ByVal arg As T) As T
            ...
        End Function
    End Class
    
    class A 
    {
        T G<T>(T arg) {...}
    }
    class Generic<T> 
    {
        T M(T arg) {...}
    }
    
    ref class A 
    {
        generic<T> T G(T arg) {...};
    };
    generic<typename T> ref class Generic 
    {
        T M(T arg) {...};
    };
    

Visual C++, C# y Visual Basic proporcionan compatibilidad completa para definir y utilizar los genéricos. Para obtener más información, vea Tipos genéricos en Visual Basic, Introducción a los genéricos (Guía de programación de C#) e Overview of Generics in Visual C++.

Tipos anidados y genéricos

Un tipo que está anidado en un tipo genérico puede depender de los parámetros de tipo del tipo genérico envolvente. Common Language Runtime considera que los tipos anidados son genéricos, aunque no tengan parámetros de tipo genérico propios. Cuando se crea una instancia de un tipo anidado, es necesario especificar los argumentos de tipo de todos los tipos genéricos envolventes.

Vea también

Tareas

Cómo: Definir un tipo genérico con Reflection Emit

Conceptos

Cuándo utilizar colecciones genéricas

Tipos genéricos en Visual Basic

Overview of Generics in Visual C++

Colecciones genéricas en .NET Framework

Delegados genéricos para manipular matrices y listas

Interfaces genéricas

Ventajas y limitaciones de genéricos

Referencia

System.Collections.Generic

System.Collections.ObjectModel

Introducción a los genéricos (Guía de programación de C#)

Otros recursos

Tipos de colección utilizados normalmente

Reflexión y tipos genéricos

Genéricos en .NET Framework