Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 classe Playlist dans l'espace de noms Music qui 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 Count qui 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 Hit

Remarquez 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()
    }
}
quiz iconTestez-vous

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