Compartilhar via


Introduction to Generics (C# Programming Guide)

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. Com mais freqüência, os genéricos são usados com coleções e os métodos que operam sobre eles. A versão 2.0 do.NET Framework oferece um novo namespace, System.Collections.Generic, que contém vários novos coleção genérica com classes. É recomendável que todos os aplicativos de destino a .NET Framework 2.0 e 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 Generics in the .NET Framework Class Library (C# Programming Guide).

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 classeList<T> , fornecida pela.NET Framework class library em vez de criar seus próprios.) 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 parâmetro no método de 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 o t está disponível para o aninhadas Node classe. Quando GenericList<T> é 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 classe 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

Generics (C# Programming Guide)

System.Collections.Generic

Conceitos

C# Programming Guide