Indicizzatori (this[])
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 37 di 70.
Gli indicizzatori ti permettono di accedere agli elementi della tua classe usando la notazione tra parentesi quadre, simile a quella degli array. Invece di chiamare un metodo come collection.GetItem(0), puoi scrivere la forma più intuitiva collection[0].
Definisci un indicizzatore usando la parola chiave this con le parentesi quadre:
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; }
}
}Ora puoi accedere alle parole in modo naturale:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#Gli indicizzatori non sono limitati agli interi. Puoi usare qualsiasi tipo come parametro di indice, rendendoli utili per un accesso simile a quello dei dizionari:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Come le proprietà, gli indicizzatori possono essere di sola lettura (omettendo il setter) o includere logica di convalida nei relativi accessori. Sono ideali quando la tua classe avvolge una raccolta o quando la notazione con parentesi quadre rende il codice più leggibile.
Sfida
FacileCreiamo una classe Playlist che ti consenta di accedere ai brani usando un’intuitiva notazione con parentesi quadre, proprio come quando lavori con un array. Creerai una playlist musicale in cui i brani possono essere recuperati e aggiornati in base alla loro posizione usando un indicizzatore.
Organizzerai il codice in due file:
Playlist.cs: crea una classePlaylistnello spazio dei nomiMusicche racchiuda una raccolta interna di brani e fornisca un accesso simile a quello di un array tramite un indicizzatore. La playlist dovrebbe avere:- Un array di stringhe privato per memorizzare i titoli dei brani
- Un costruttore che accetti una stringa di titoli dei brani separati da virgole e la divida nell’array interno
- Un indicizzatore che usa
this[int index]e consente sia di ottenere sia di impostare i brani in una posizione specifica - Una proprietà di sola lettura
Countche restituisce il numero di brani nella playlist - Un metodo
GetAllSongs()che restituisce tutti i brani uniti da" | "
Program.cs: nel file principale, crea una playlist a partire dall’input, poi usa l’indicizzatore per accedere ai brani e modificarli. Mostra sia come leggere i brani tramite indice sia come aggiornare un brano in una posizione specifica.
Riceverai tre input:
- Un elenco di titoli di brani separati da virgole (ad es.
Song A,Song B,Song C) - Un indice da recuperare (intero)
- Un nuovo titolo di brano che sostituirà il brano allo stesso indice
Stampa l’output in questo formato:
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}Per esempio, se gli input sono Rock Anthem,Jazz Vibes,Pop Hit, 1 e Blues Classic, l’output dovrebbe essere:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop HitNota come l’indicizzatore ti consente di accedere a playlist[1] per ottenere "Jazz Vibes" e poi assegnare playlist[1] = "Blues Classic" per aggiornarlo: è molto più naturale che chiamare metodi come GetSongAt(1) o SetSongAt(1, "Blues Classic")!
Provalo tu
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// Leggi i dati di input
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: Crea un oggetto Playlist a partire da songList
// TODO: Stampa il numero totale di brani usando la proprietà Count
// TODO: Stampa il brano all'indice specificato usando l'indicizzatore
// TODO: Aggiorna il brano all'indice specificato usando l'indicizzatore
// TODO: Stampa tutti i brani dopo l'aggiornamento usando GetAllSongs()
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online