Indexeurs (this[])
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 37 sur 70.
Les indexeurs vous permettent d'accéder aux éléments de votre classe en utilisant une notation entre crochets semblable à celle des tableaux. Au lieu d'appeler une méthode comme collection.GetItem(0), vous pouvez écrire le plus intuitif collection[0].
Vous définissez un indexeur en utilisant le mot-clé this avec des crochets :
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}Maintenant, vous pouvez accéder aux mots naturellement :
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#Les indexeurs ne sont pas limités aux entiers. Vous pouvez utiliser n'importe quel type comme paramètre d'index, ce qui les rend utiles pour un accès de type dictionnaire :
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Comme les propriétés, les indexeurs peuvent être en lecture seule (omettez le setter) ou inclure une logique de validation dans leurs accesseurs. Ils sont idéaux lorsque votre classe enveloppe une collection ou lorsque la notation entre crochets rend le code plus lisible.
Défi
FacileConstruisons une classe Playlist qui vous permet d'accéder aux chansons en utilisant une notation intuitive entre crochets, tout comme si vous travailliez avec un tableau. Vous allez créer une liste de lecture musicale où les chansons peuvent être récupérées et mises à jour par leur position à l'aide d'un indexeur.
Vous organiserez votre code sur deux fichiers :
Playlist.cs: Créez une classePlaylistdans l'espace de nomsMusicqui enveloppe une collection interne de chansons et fournit un accès de type tableau via un indexeur. Votre playlist doit comporter :- Un tableau de chaînes de caractères privé pour stocker les titres des chansons
- Un constructeur qui accepte une chaîne de titres de chansons séparés par des virgules et la divise dans le tableau interne
- Un indexeur utilisant
this[int index]qui permet à la fois de récupérer et de modifier des chansons à une position spécifique - Une propriété en lecture seule
Countqui renvoie le nombre de chansons dans la playlist - Une méthode
GetAllSongs()qui renvoie toutes les chansons jointes par" | "
Program.cs: Dans votre fichier principal, créez une playlist à partir de l'entrée, puis utilisez l'indexeur pour accéder aux chansons et les modifier. Démontrez à la fois la lecture de chansons par index et la mise à jour d'une chanson à une position spécifique.
Vous recevrez trois entrées :
- Une liste de titres de chansons séparés par des virgules (par exemple,
Song A,Song B,Song C) - Un index à récupérer (entier)
- Un nouveau titre de chanson pour remplacer la chanson à ce même index
Affichez la sortie dans ce format :
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}Par exemple, si les entrées sont Rock Anthem,Jazz Vibes,Pop Hit, 1, et Blues Classic, la sortie devrait être :
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop HitRemarquez comment l'indexeur vous permet d'accéder à playlist[1] pour obtenir "Jazz Vibes", puis d'assigner playlist[1] = "Blues Classic" pour le mettre à jour - c'est beaucoup plus naturel que d'appeler des méthodes comme GetSongAt(1) ou SetSongAt(1, "Blues Classic") !
Aide-mémoire
Les indexeurs vous permettent d'accéder aux éléments de votre classe en utilisant une notation entre crochets de type tableau (collection[0]) au lieu d'appels de méthodes.
Définissez un indexeur en utilisant le mot-clé this avec des crochets :
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}Exemple d'utilisation :
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#Les indexeurs peuvent utiliser n'importe quel type comme paramètre d'index, pas seulement des entiers :
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Comme les propriétés, les indexeurs peuvent être en lecture seule (omettre le setter) ou inclure une logique de validation dans leurs accesseurs.
Essayez vous-même
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// Lire les entrées
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: Créer un objet Playlist à partir de songList
// TODO: Afficher le nombre total de chansons en utilisant la propriété Count
// TODO: Afficher la chanson à l'index donné en utilisant l'indexeur
// TODO: Mettre à jour la chanson à l'index donné en utilisant l'indexeur
// TODO: Afficher toutes les chansons après la mise à jour en utilisant GetAllSongs()
}
}
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