Compartir a través de


Clases y métodos genéricos

Los genéricos presentan el concepto de parámetros de tipo en .NET. Los genéricos permiten diseñar clases y métodos que aplazan la especificación de uno o varios parámetros de tipo hasta que se usa la clase o el método en el código. Por ejemplo, al usar un parámetro de tipo genérico T, puede escribir una clase única que otro código de cliente puede usar sin incurrir en el costo o riesgo de conversiones en tiempo de ejecución u operaciones de conversión boxing, como se muestra aquí:

// Declare the generic class.
public class GenericList<T>
{
    public void Add(T item) { }
}

public class ExampleClass { }

class TestGenericList
{
    static void Main()
    {
        // Create a list of type int.
        GenericList<int> list1 = new();
        list1.Add(1);

        // Create a list of type string.
        GenericList<string> list2 = new();
        list2.Add("");

        // Create a list of type ExampleClass.
        GenericList<ExampleClass> list3 = new();
        list3.Add(new ExampleClass());
    }
}

Las clases y métodos genéricos combinan la reutilización, la seguridad de tipos y la eficacia de una manera que sus homólogos no genéricos no pueden. Los parámetros de tipo genérico se reemplazan por los argumentos de tipo durante la compilación. En el ejemplo anterior, el compilador reemplaza T por int. Los genéricos se utilizan con mayor frecuencia en colecciones y en los métodos que operan sobre ellas. El System.Collections.Generic espacio de nombres contiene varias clases de colección de tipo genérico. Las colecciones no genéricas, como ArrayList no se recomiendan y solo se mantienen con fines de compatibilidad. Para más información, vea Elementos genéricos en .NET.

También puede crear tipos genéricos personalizados y métodos para ofrecer soluciones generalizadas y patrones de diseño propios que sean seguros para el tipo y eficientes. En el ejemplo de código siguiente se muestra una clase de lista vinculada genérica simple con fines de demostración. (En la mayoría de los casos, debe usar la List<T> clase proporcionada por .NET en lugar de crear su propia). El parámetro T type se usa en varias ubicaciones donde normalmente se usaría un tipo concreto para indicar el tipo del elemento almacenado en la lista:

  • Como el tipo de un parámetro de método en el método AddHead.
  • Como el tipo de valor devuelto de la propiedad Data en la clase anidada Node.
  • Como el tipo de miembro privado data de la clase anidada.

T está disponible en la clase anidada Node. Cuando GenericList<T> se instancia con un tipo concreto, por ejemplo, como un GenericList<int>, cada aparición de T se reemplaza por int.

// Type parameter T in angle brackets.
public class GenericList<T>
{
    // The nested class is also generic, and
    // holds a data item of type T.
    private class Node(T t)
    {
        // T as property type.
        public T Data { get; set; } = t;

        public Node? Next { get; set; }
    }

    // First item in the linked list
    private Node? head;

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

    // T in method return type.
    public IEnumerator<T> GetEnumerator()
    {
        Node? current = head;

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

En el ejemplo de código siguiente se muestra cómo el código de cliente usa la clase genérica GenericList<T> para crear una lista de enteros. Si cambia el argumento type, el código siguiente crea listas de cadenas o cualquier otro tipo personalizado:

// A generic list of int.
GenericList<int> list = new();

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

// Write them to the console.
foreach (int i in list)
{
    Console.WriteLine(i);
}

Console.WriteLine("Done");

Nota:

Los tipos genéricos no se limitan a las clases. Los ejemplos anteriores usan class tipos, pero puede definir tipos genéricos interface y struct, incluidos los tipos record.

Introducción a los genéricos

  • 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 de .NET contiene varias clases de colecciones genéricas en el System.Collections.Generic espacio de nombres. Las colecciones genéricas se deben usar siempre que sea posible en lugar de clases como ArrayList del espacio de nombres System.Collections.
  • Puede crear sus propias interfaces genéricas, clases, métodos, eventos y delegados.
  • Las clases genéricas se pueden restringir para permitir el acceso a métodos en tipos de datos concretos.
  • Puede obtener información en tiempo de ejecución sobre los tipos que se usan en un tipo de datos genérico mediante la reflexión.

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#.

Consulte también