Méthodes d'extension
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 39 sur 70.
Les méthodes d'extension vous permettent d'ajouter de nouvelles méthodes à des types existants sans modifier leur code source ou créer de classes dérivées. Elles apparaissent comme s'il s'agissait de méthodes natives du type, rendant votre code plus lisible et intuitif.
Pour créer une méthode d'extension, définissez une méthode statique dans une classe statique, avec le premier paramètre précédé du mot-clé this :
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}Maintenant, vous pouvez appeler cette méthode directement sur n'importe quelle chaîne de caractères :
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3Le paramètre this string str indique au compilateur que cette méthode étend le type string. Lorsque vous appelez sentence.WordCount(), le compilateur le traduit en StringExtensions.WordCount(sentence) en coulisses.
Les méthodes d'extension peuvent également accepter des paramètres supplémentaires :
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
// Utilisation
bool result = "Hello".IsLongerThan(3); // trueCette technique est largement utilisée dans LINQ, où des méthodes comme Where() et Select() sont des méthodes d'extension sur IEnumerable. Les méthodes d'extension sont puissantes pour ajouter des fonctions utilitaires à des types que vous ne contrôlez pas, tout en gardant votre code propre et expressif.
Défi
FacileCréons un ensemble de méthodes d'extension utiles pour les entiers qui ajoutent des fonctionnalités pratiques que vous vous attendriez à trouver intégrées. Vous allez créer une classe statique contenant des méthodes d'extension qui peuvent être appelées directement sur n'importe quel entier, rendant votre code plus expressif et lisible.
Vous organiserez votre code sur deux fichiers :
IntExtensions.cs: Créez une classe statique appeléeIntExtensionsdans l'espace de nomsUtilities. Cette classe contiendra des méthodes d'extension qui améliorent le typeint:IsEven()- retournetruesi le nombre est pair,falsesinonSquare()- retourne le nombre multiplié par lui-mêmeIsInRange(int min, int max)- retournetruesi le nombre est compris entre min et max (inclus),falsesinon
thispour spécifier quel type vous étendez.Program.cs: Dans votre fichier principal, lisez un entier à partir de l'entrée et faites la démonstration des trois méthodes d'extension. Appelez chaque méthode directement sur l'entier comme s'il s'agissait d'une méthode intégrée, puis affichez les résultats.
Vous recevrez trois entrées :
- Un nombre à tester (entier)
- Une valeur minimale pour la vérification de la plage (entier)
- Une valeur maximale pour la vérification de la plage (entier)
Affichez la sortie dans ce format :
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}Par exemple, si les entrées sont 7, 5 et 10, la sortie devrait être :
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? TrueRemarquez avec quelle aisance vous pouvez écrire number.IsEven() et number.Square() - les méthodes d'extension donnent l'impression d'avoir toujours fait partie du type entier !
Aide-mémoire
Les méthodes d'extension vous permettent d'ajouter de nouvelles méthodes à des types existants sans modifier leur code source. Elles doivent être définies comme des méthodes statiques dans une classe statique, le premier paramètre étant précédé du mot-clé this.
Syntaxe de base d'une méthode d'extension :
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}Utilisation :
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3Le mot-clé this devant le premier paramètre indique quel type est étendu. Le compilateur traduit sentence.WordCount() en StringExtensions.WordCount(sentence).
Méthodes d'extension avec des paramètres supplémentaires :
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
bool result = "Hello".IsLongerThan(3); // trueEssayez vous-même
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// Lire les entrées
int number = Convert.ToInt32(Console.ReadLine());
int min = Convert.ToInt32(Console.ReadLine());
int max = Convert.ToInt32(Console.ReadLine());
// TODO: Utiliser les méthodes d'extension sur 'number' et afficher les résultats
// Appeler number.IsEven(), number.Square(), et number.IsInRange(min, max)
// Afficher au format :
// Est-ce que {number} est pair ? {True/False}
// Carré de {number} : {result}
// Est-ce que {number} est dans l'intervalle [{min}-{max}] ? {True/False}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur