Menu
Coddy logo textTech

Indexadores (this[])

Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 37 de 70.

Indexadores permitem que você acesse elementos em sua classe usando a notação de colchetes semelhante a um array. Em vez de chamar um método como collection.GetItem(0), você pode escrever o mais intuitivo collection[0].

Você define um indexador usando a palavra-chave this com colchetes:

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; }
    }
}

Agora você pode acessar as palavras naturalmente:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

Indexadores não se limitam a inteiros. Você pode usar qualquer tipo como parâmetro de índice, o que os torna úteis para acessos do tipo dicionário:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

Assim como as propriedades, os indexadores podem ser somente leitura (omitindo o setter) ou incluir lógica de validação em seus acessores. Eles são ideais quando sua classe envolve uma coleção ou quando a notação de colchetes torna o código mais legível.

challenge icon

Desafio

Fácil

Vamos construir uma classe Playlist que permite acessar músicas usando a notação intuitiva de colchetes, assim como trabalhar com um array. Você criará uma playlist de músicas onde as músicas podem ser recuperadas e atualizadas por sua posição usando um indexador.

Você organizará seu código em dois arquivos:

  • Playlist.cs: Crie uma classe Playlist no namespace Music que envolve uma coleção interna de músicas e fornece acesso semelhante a um array por meio de um indexador. Sua playlist deve ter:
    • Um array de strings privado para armazenar os títulos das músicas
    • Um construtor que aceita uma string de títulos de músicas separada por vírgulas e a divide no array interno
    • Um indexador usando this[int index] que permite obter e definir músicas em uma posição específica
    • Uma propriedade somente leitura Count que retorna o número de músicas na playlist
    • Um método GetAllSongs() que retorna todas as músicas unidas por " | "
  • Program.cs: No seu arquivo principal, crie uma playlist a partir da entrada e use o indexador para acessar e modificar as músicas. Demonstre tanto a leitura de músicas por índice quanto a atualização de uma música em uma posição específica.

Você receberá três entradas:

  • Uma lista de títulos de músicas separada por vírgulas (ex: Song A,Song B,Song C)
  • Um índice para recuperar (inteiro)
  • Um novo título de música para substituir a música naquele mesmo índice

Imprima a saída neste formato:

Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}

Por exemplo, se as entradas forem Rock Anthem,Jazz Vibes,Pop Hit, 1, e Blues Classic, a saída deve ser:

Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hit

Observe como o indexador permite acessar playlist[1] para obter "Jazz Vibes" e, em seguida, atribuir playlist[1] = "Blues Classic" para atualizá-lo - muito mais natural do que chamar métodos como GetSongAt(1) ou SetSongAt(1, "Blues Classic")!

Folha de consulta

Indexadores permitem que você acesse elementos em sua classe usando a notação de colchetes semelhante a arrays (collection[0]) em vez de chamadas de método.

Defina um indexador usando a palavra-chave this com colchetes:

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; }
    }
}

Exemplo de uso:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

Indexadores podem usar qualquer tipo como parâmetro de índice, não apenas inteiros:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

Assim como as propriedades, os indexadores podem ser somente leitura (omita o setter) ou incluir lógica de validação em seus acessores.

Experimente você mesmo

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // Ler as entradas
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO: Criar um objeto Playlist a partir da songList

        // TODO: Imprimir o número total de músicas usando a propriedade Count

        // TODO: Imprimir a música no índice fornecido usando o indexador

        // TODO: Atualizar a música no índice fornecido usando o indexador

        // TODO: Imprimir todas as músicas após a atualização usando GetAllSongs()
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos