Génériques
Les génériques en C# sont une fonctionnalité essentielle qui permet aux développeurs de créer des classes, des méthodes et des structures de données pouvant fonctionner avec différents types tout en garantissant la sécurité de type à la compilation et des performances optimales. Grâce aux génériques, il est possible de concevoir des composants réutilisables sans dupliquer le code pour chaque type, réduisant ainsi les erreurs à l’exécution et améliorant la maintenabilité et l’évolutivité des applications.
Les génériques sont particulièrement utiles dans la création de collections (List
Dans ce tutoriel, vous apprendrez à définir des classes et des méthodes génériques, à appliquer des contraintes de type pour contrôler les types autorisés, et à utiliser les génériques dans des scénarios concrets de développement. Vous comprendrez comment intégrer les génériques dans des projets C# réels pour construire des composants évolutifs, réutilisables et performants, tout en respectant les bonnes pratiques en matière de gestion de la mémoire et de gestion des exceptions.
Exemple de Base
textusing System;
namespace GenericsDemo
{
// Définition d'une classe générique
public class BoiteGenerique<T>
{
private T contenu;
public void Ajouter(T item)
{
contenu = item;
}
public T Obtenir()
{
return contenu;
}
}
class Program
{
static void Main(string[] args)
{
// Utilisation de la classe générique avec un int
BoiteGenerique<int> boiteEntier = new BoiteGenerique<int>();
boiteEntier.Ajouter(42);
Console.WriteLine("Contenu de la boîte : " + boiteEntier.Obtenir());
// Utilisation de la classe générique avec une string
BoiteGenerique<string> boiteTexte = new BoiteGenerique<string>();
boiteTexte.Ajouter("Bonjour le monde");
Console.WriteLine("Contenu de la boîte : " + boiteTexte.Obtenir());
}
}
}
Cet exemple montre la structure de base des génériques en C#. La classe BoiteGeneriquecontenu
stocke la valeur, tandis que les méthodes Ajouter
et Obtenir
permettent de définir et récupérer cette valeur.
Dans la méthode Main, les instances BoiteGenerique
Cette approche est utile pour créer des conteneurs réutilisables, des caches ou des bibliothèques d’algorithmes dans des projets C# réels. Elle constitue la base pour des applications plus complexes et des architectures modulaires.
Exemple Pratique
textusing System;
using System.Collections.Generic;
namespace AdvancedGenericsDemo
{
// Classe de dépôt générique avec contrainte sur les types référence
public class Depot<T> where T : class
{
private List<T> elements = new List<T>();
public void Ajouter(T item)
{
if (item == null)
throw new ArgumentNullException(nameof(item), "L'élément ne peut pas être null");
elements.Add(item);
}
public T Rechercher(Predicate<T> predicate)
{
return elements.Find(predicate);
}
public void AfficherTous()
{
foreach (var item in elements)
{
Console.WriteLine(item.ToString());
}
}
}
class Produit
{
public string Nom { get; set; }
public decimal Prix { get; set; }
public override string ToString()
{
return $"{Nom} - {Prix} €";
}
}
class Program
{
static void Main(string[] args)
{
Depot<Produit> depotProduits = new Depot<Produit>();
depotProduits.Ajouter(new Produit { Nom = "Ordinateur Portable", Prix = 1200 });
depotProduits.Ajouter(new Produit { Nom = "Smartphone", Prix = 800 });
Console.WriteLine("Tous les produits :");
depotProduits.AfficherTous();
Produit produitCher = depotProduits.Rechercher(p => p.Prix > 1000);
Console.WriteLine("Produit le plus cher : " + produitCher);
}
}
}
Dans cet exemple pratique, la classe Depotwhere T : class
pour n’accepter que des types référence. Les méthodes Ajouter
, Rechercher
et AfficherTous
permettent de gérer les éléments de manière sécurisée et efficace. L’ajout d’un contrôle sur les valeurs nulles assure la robustesse de l’application.
La classe Produit représente un objet métier réel avec des propriétés Nom et Prix, et redéfinit la méthode ToString pour faciliter l’affichage. La méthode Main montre comment utiliser Depot
Les meilleures pratiques et pièges courants pour les génériques en C# incluent :
- Utiliser des contraintes de type pour garantir des types valides dans les classes et méthodes génériques.
- Éviter de stocker des ressources non gérées sans libération appropriée afin de prévenir les fuites mémoire.
- Utiliser les collections génériques intégrées (List
, Dictionary\ ) pour de meilleures performances. - Mettre en place une gestion claire des exceptions pour gérer les entrées nulles ou invalides.
- Ne pas sur-généraliser inutilement les types génériques, cela pourrait complexifier le code.
- Lors du débogage, surveiller attentivement les types réels passés en paramètre.
- Optimiser les performances en réduisant le boxing/unboxing et en utilisant judicieusement les contraintes et interfaces.
- Prendre en compte la sécurité, notamment en validant les types passés et en protégeant les données sensibles dans les interfaces génériques.
📊 Tableau de Référence
C# Element/Concept | Description | Usage Example |
---|---|---|
Classe Générique | Classe pouvant gérer plusieurs types | public class Boite<T> { T contenu; } |
Méthode Générique | Méthode pouvant fonctionner sur plusieurs types | public T ObtenirElement<T>(T item) { return item; } |
Contraintes | Restreint les types autorisés | where T : class, new() |
List<T> | Collection générique de type liste | List<int> nombres = new List<int>(); |
Dictionary\<TKey,TValue> | Collection clé-valeur générique | Dictionary\<string,int> ages = new Dictionary\<string,int>(); |
Predicate<T> | Délégué de condition pour recherche | elements.Find(p => p.Prix > 100); |
Résumé et prochaines étapes :
Maîtriser les génériques en C# permet de créer du code réutilisable, sûr et performant. Les classes, méthodes et collections génériques facilitent la gestion des données et l’implémentation d’algorithmes complexes avec moins de duplication. Les génériques contribuent à des architectures modulaires et maintenables, réduisant les erreurs à l’exécution et optimisant la performance globale du système.
Pour aller plus loin, explorez les collections avancées comme Stack
🧠 Testez Vos Connaissances
Testez vos Connaissances
Testez votre compréhension de ce sujet avec des questions pratiques.
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut