Introduzione ai generics (Guida per programmatori C#)

Le classi e i metodi generici sono riutilizzabili, indipendenti dai tipi e molto più efficaci rispetto alle rispettive controparti non generiche. I generics sono in genere utilizzati con gli insiemi e con i metodi che operano su di essi. La versione 2.0 della libreria di classi di .NET Framework fornisce un nuovo spazio dei nomi, System.Collections.Generic, che contiene numerose nuove classi di insiemi generiche. In tutte le applicazioni destinate a .NET Framework 2.0 e versioni successive è consigliabile utilizzare le nuove classi di insiemi generiche anziché le controparti non generiche meno recenti, quale ArrayList. Per ulteriori informazioni, vedere la classe Generics nella libreria di classi .NET Framework (Guida per programmatori C#).

È naturalmente anche possibile creare tipi e metodi generici personalizzati per creare soluzioni e schemi di progettazione generalizzati efficaci e indipendenti dai tipi. Nell'esempio di codice riportato di seguito viene illustrata una classe di elenco collegato generica semplice a scopo dimostrativo. Nella maggior parte dei casi, è necessario utilizzare la classe List<T> fornita dalla libreria di classi .NET Framework anziché crearne una propria. Il parametro di tipo T viene utilizzato in diverse posizioni in cui di norma verrebbe utilizzato un tipo concreto per indicare il tipo dell'elemento archiviato nell'elenco. In particolare, viene utilizzato nei seguenti modi:

  • Come tipo di un parametro di metodo nel metodo AddHead.

  • Come tipo restituito del metodo pubblico GetNext e della proprietà Data nella classe Node annidata.

  • Come tipo dei dati del membro privato nella classe annidata.

Si noti che T è disponibile per la classe Node annidata. Quando si crea un'istanza di GenericList<T> con un tipo concreto, ad esempio GenericList<int>, ogni occorrenza di T verrà sostituita con 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;
        }
    }
}

Nell'esempio di codice riportato di seguito viene illustrato l'utilizzo della classe generica GenericList<T> per creare un elenco di valori interi. Cambiando semplicemente l'argomento relativo al tipo, è possibile modificare il codice riportato di seguito per creare elenchi di stringhe o di qualsiasi altro tipo personalizzato:

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");
    }
}

Vedere anche

Riferimenti

Generics (Guida per programmatori C#)

System.Collections.Generic

Concetti

Guida per programmatori C#