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.
Desafio
FácilVamos 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 classePlaylistno namespaceMusicque 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
Countque 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 HitObserve 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()
}
}
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
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos