Compartir a través de


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

Las clases y los métodos genéricos combinan reusabilidad, seguridad de tipos y eficacia de una manera que sus homólogos no genéricos no pueden. Los tipos genéricos se utilizan frecuentemente con las colecciones y los métodos que funcionan en ellas. La versión 2.0 de la biblioteca de clases de .NET Framework proporciona un nuevo espacio de nombres, System.Collections.Generic, que contiene varias clases nuevas de colección basadas en tipos genéricos. Se recomienda que todas las aplicaciones destinadas a .NET Framework 2.0 y versiones posteriores utilicen las nuevas clases de colección genéricas en lugar de sus homólogas no genéricas anteriores, como ArrayList. Para obtener más información, vea Tipos genéricos en la biblioteca de clases de .NET Framework (Guía de programación de C#).

Claro está que también se pueden crear tipos y métodos genéricos personalizados para proporcionar soluciones generalizadas propias y diseñar modelos eficaces que tengan seguridad de tipos. El ejemplo de código siguiente muestra una clase de lista vinculada genérica para propósitos de demostración. (En la mayoría de los casos, es aconsejable utilizar la clase List proporcionada por la biblioteca de clases de .NET Framework en lugar de crear una propia.) El parámetro de tipo T se emplea en diversas ubicaciones donde generalmente se utilizaría un tipo concreto para indicar el tipo del elemento almacenado en la lista. Este parámetro se utiliza de las formas siguientes:

  • Como tipo de un parámetro de método en el método AddHead.

  • Como tipo de valor devuelto del método público GetNext y la propiedad Data en la clase anidada Node.

  • Como tipo de datos de los miembros privados en la clase anidada.

Observe que T está disponible para la clase anidada Node. Cuando se creen instancias de GenericList<T> con un tipo concreto, por ejemplo GenericList<int>, cada aparición de T se reemplazará por int.

// type parameter T in angle brackets 
public class GenericList<T> 
{
    // The nested class is also generic on T. 
    private class Node
    {
        // T used in non-generic constructor. 
        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }

        // T as private member data type. 
        private T data;

        // T as return type of property. 
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;

    // constructor 
    public GenericList() 
    {
        head = null;
    }

    // T as method parameter type: 
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

En el ejemplo de código siguiente se muestra cómo el código de cliente utiliza la clase genérica GenericList<T> para crear una lista de enteros. Con sólo cambiar el argumento de tipo, el código siguiente puede modificarse fácilmente para crear listas de cadenas o cualquier otro tipo personalizado:

class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();

        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }

        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}

Vea también

Referencia

Genéricos (Guía de programación de C#)

System.Collections.Generic

Conceptos

Guía de programación de C#