C# Génériques

GénériquesVous permettent de différer la spécification du type de données des éléments de programmation dans une classe ou une méthode jusqu'à ce qu'il soit réellement utilisé dans le programme. En d'autres termes, les génériques vous permettent d'écrire une classe ou une méthode qui peut fonctionner avec n'importe quel type de données.

Vous pouvez écrire des spécifications pour des classes ou des méthodes en utilisant des paramètres de substitution pour les types de données. Lorsque le compilateur rencontre un constructeur de classe ou un appel de méthode, il génère du code pour gérer le type de données spécifié. L'exemple simple suivant vous aidera à comprendre ce concept :

Exemple

using System;
using System.Collections.Generic;

namespace GenericApplication
{
    public class MyGenericArray<T>
    {
        private T[] array;
        public MyGenericArray(int size)
        {
            array = new T[size + 1];
        }
        public T getItem(int index)
        {
            return array[index];
        }
        public void setItem(int index, T value)
        {
            array[index] = value;
        }
    }
           
    class Tester
    {
        static void Main(string[] args)
        {
            // Déclarer un tableau d'entiers
            MyGenericArray<int> intArray = new MyGenericArray<int>(5);
            // Définir la valeur
            for (int c = 0; c < 5; c++)
            {
                intArray.setItem(c, c*5);
            }
            // Obtenir la valeur
            for (int c = 0; c < 5; c++)
            {
                Console.Write(intArray.getItem(c) + " ");
            }
            Console.WriteLine();
            // Déclarer un tableau de caractères
            MyGenericArray<char> charArray = new MyGenericArray<char>(5);
            // Définir la valeur
            for (int c = 0; c < 5; c++)
            {
                charArray.setItem(c, (char)(c+97));
            }
            // Obtenir la valeur
            for (int c = 0; c < 5; c++)
            {
                Console.Write(charArray.getItem(c) + " ");
            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

0 5 10 15 20
a b c d e

Fonctionnalités des génériques

L'utilisation des génériques est une technique permettant d'améliorer les fonctionnalités d'un programme, notamment dans les aspects suivants :

  • Il vous aide à maximiser la réutilisation du code, à protéger la sécurité des types et à améliorer les performances.
  • Vous pouvez créer des classes de collection génériques. La bibliothèque de classes du .NET Framework dans l'espace de nomsSystem.Collections.Genericcontient de nouvelles classes de collection génériques. Vous pouvez utiliser ces classes de collection génériques pour remplacerSystem.CollectionsClasses de collection dans.
  • Vous pouvez créer vos propres interfaces génériques, classes génériques, méthodes génériques, événements génériques et délégués génériques.
  • Vous pouvez contraindre des classes génériques à accéder aux méthodes de types de données spécifiques.
  • Les informations sur les types utilisés dans les types de données génériques peuvent être obtenues au moment de l'exécution grâce à l'utilisation de la réflexion.

Méthodes génériques

Dans l'exemple ci-dessus, nous avons utilisé des classes génériques. Nous pouvons déclarer des méthodes génériques à l'aide de paramètres de type. Le programme suivant illustre ce concept :

Exemple

using System;
using System.Collections.Generic;

namespace GenericMethodAppl
{
    class Program
    {
        static void Swap<T>(ref T lhs, ref T rhs)
        {
            T temp;
            temp = lhs;
            lhs = rhs;
            rhs = temp;
        }
        static void Main(string[] args)
        {
            int a, b;
            char c, d;
            a = 10;
            b = 20;
            c = 'I';
            d = 'V';

            // Afficher les valeurs avant l'échange
            Console.WriteLine("Valeurs int avant d'appeler swap :");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Valeurs char avant d'appeler swap :");
            Console.WriteLine("c = {0}, d = {1}", c, d);

            // appeler swap
            Swap<int>(ref a, ref b);
            Swap<char>(ref c, ref d);

            // Afficher les valeurs après l'échange
            Console.WriteLine("Valeurs int après l'appel de swap :");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Valeurs char après l'appel de swap :");
            Console.WriteLine("c = {0}, d = {1}", c, d);
            Console.ReadKey();
        }
    }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Int values before calling swap:
a = 10, b = 20
Char values before calling swap:
c = I, d = V
Int values after calling swap:
a = 20, b = 10
Char values after calling swap:
c = V, d = I

Délégués génériques

Vous pouvez définir des délégués génériques à l'aide de paramètres de type. Par exemple :

delegate T NumberChanger<T>(T n);

L'exemple suivant montre l'utilisation des délégués :

Exemple

using System;
using System.Collections.Generic;

delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
    class TestDelegate
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }

        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }
        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            // Créer une instance de délégué
            NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
            NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);
            // Utiliser un objet délégué pour appeler une méthode
            nc1(25);
            Console.WriteLine("Valeur de Num : {0}", getNum());
            nc2(5);
            Console.WriteLine("Valeur de Num : {0}", getNum());
            Console.ReadKey();
        }
    }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Value of Num: 35
Value of Num: 175
autres extensions