Share via


Introdução aos genéricos (Guia de Programação em C#)

Classes genéricas e métodos combinam reutilização, segurança de tipo e a eficiência de uma forma que suas contrapartes não podem. Genéricos são usados com mais freqüência com coleções e os métodos que operam sobre eles. Versão 2.0 do.NET Framework oferece um novo namespace, System.Collections.Generic, que contém várias classes de coleção genérica com base em novo. É recomendável que todos os aplicativos de destino a .NET Framework 2.0 e versões posteriores usam as novas classes de coleção genérica em vez das contrapartes não genéricos mais antigos, como ArrayList. Para obter mais informações, consulte Genéricos na biblioteca de classes .NET Framework (Guia de Programação em C#).

Claro, você também pode criar tipos genéricos e métodos para fornecer sua própria solução generalizada e padrões de projeto que são fortemente tipados e eficientes. O exemplo de código a seguir mostra uma classe simple de lista vinculada genérica para fins de demonstração. (Na maioria dos casos, você deve usar o List classe fornecida pela.NET Framework class library em vez de criar sua própria). O parâmetro de tipo T é usado em vários locais onde um tipo concreto normalmente deve ser usado para indicar o tipo do item armazenado na lista. Ele é usado das seguintes maneiras:

  • Como o tipo de um parâmetro de método na AddHead método.

  • Como o tipo de retorno do método público GetNext e o Data propriedade no aninhadas Node classe.

  • Como o tipo de dado no membro privado na classe aninhada.

Observe que t está disponível para o aninhadas Node classe. Quando GenericList<T> for instanciado com um tipo concreto, por exemplo como um GenericList<int>, cada ocorrência de T será substituído 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;
        }
    }
}

O exemplo de código a seguir mostra como o código do cliente usa a genérica GenericList<T> classe para criar uma lista de números inteiros. Simplesmente alterando o tipo de argumento, o código a seguir poderia facilmente ser modificado para criar listas de string ou qualquer outro 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");
    }
}

Consulte também

Referência

Genéricos (Guia de Programação em C#)

System.Collections.Generic

Conceitos

Guia de Programação em C#