Introduction aux génériques (Guide de programmation C#)

Mise à jour : novembre 2007

Les classes génériques et les méthodes combinent un niveau de réutilisabilité, de sécurité de type et d'efficacité sans commune mesure avec leurs homologues non génériques. Les génériques sont le plus souvent utilisés avec des collections et méthodes qui fonctionnent sur eux. La version 2.0 de la bibliothèque de classes .NET Framework fournit un nouvel espace de noms, System.Collections.Generic, qui contient plusieurs nouvelles classes de collection basées sur générique. Il est recommandé que toutes les applications qui ciblent .NET Framework 2.0 et suivantes utilisent les nouvelles classes de collections génériques plutôt que des équivalents non génériques plus anciens tels que ArrayList. Pour plus d'informations, consultez Génériques dans la bibliothèque de classes .NET Framework (Guide de programmation C#).

Bien sûr, vous pouvez également créer des types et des méthodes génériques personnalisés afin de fournir vos propres solutions et modèles de design généralisés qui sont de type sécurisé et efficace. L'exemple de code suivant emploie une simple classe de liste liée générique à des fins de démonstration. (Dans la plupart des cas, vous devez utiliser la classe List<T> fournie par la bibliothèque de classes .NET Framework au lieu de créer la vôtre.) Le paramètre de type T est utilisé dans plusieurs emplacements où l'on utiliserait normalement un type concret pour indiquer le type de l'élément stocké dans la liste. Il est utilisé dans les manières suivantes :

  • Comme le type d'un paramètre de méthode dans la méthode AddHead.

  • Comme le type de retour de la méthode publique GetNext et de la propriété Data dans la classe Node imbriquée.

  • Comme le type des données de membre privé dans la classe imbriquée.

Notez que T est disponible à la classe Node imbriquée. Lorsque GenericList<T> est instancié avec un type concret, comme un GenericList<int>, par exemple, chaque occurrence de T est remplacée par 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;
        }
    }
}

L'exemple de code suivant montre comment le code client utilise la classe GenericList<T> générique pour créer une liste d'entiers. En changeant simplement l'argument de type, le code suivant pourrait être facilement modifié pour créer des listes de chaînes ou tout autre type personnalisé :

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

Voir aussi

Concepts

Guide de programmation C#

Référence

Génériques (Guide de programmation C#)

System.Collections.Generic