Indexer (this[])
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 37 von 70.
Indexer ermöglichen es Ihnen, auf Elemente in Ihrer Klasse mit einer Array-ähnlichen Klammerschreibweise zuzugreifen. Anstatt eine Methode wie collection.GetItem(0) aufzurufen, können Sie das intuitivere collection[0] schreiben.
Sie definieren einen Indexer unter Verwendung des this-Schlüsselworts mit eckigen Klammern:
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; }
}
}Jetzt können Sie auf Wörter auf natürliche Weise zugreifen:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hallo
s[1] = "C#";
Console.WriteLine(s[1]); // C#Indexer sind nicht auf Ganzzahlen beschränkt. Sie können jeden Typ als Indexparameter verwenden, was sie für einen Dictionary-ähnlichen Zugriff nützlich macht:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Wie Properties können auch Indexer schreibgeschützt sein (lassen Sie den Setter weg) oder Validierungslogik in ihren Accessoren enthalten. Sie sind ideal, wenn Ihre Klasse eine Collection umschließt oder wenn die Klammerschreibweise den Code lesbarer macht.
Aufgabe
EinfachLassen Sie uns eine Playlist-Klasse erstellen, mit der Sie über die intuitive Klammerschreibweise auf Songs zugreifen können, genau wie bei der Arbeit mit einem Array. Sie erstellen eine Musik-Playlist, in der Songs über einen Indexer anhand ihrer Position abgerufen und aktualisiert werden können.
Sie werden Ihren Code auf zwei Dateien aufteilen:
Playlist.cs: Erstellen Sie einePlaylist-Klasse im NamespaceMusic, die eine interne Sammlung von Songs kapselt und über einen Indexer einen array-ähnlichen Zugriff ermöglicht. Ihre Playlist sollte Folgendes enthalten:- Ein privates String-Array zum Speichern von Songtiteln
- Einen Konstruktor, der eine kommagetrennte Zeichenfolge von Songtiteln akzeptiert und diese in das interne Array aufteilt
- Einen Indexer mit der Syntax
this[int index], der sowohl das Abrufen als auch das Setzen von Songs an einer bestimmten Position ermöglicht - Eine schreibgeschützte Eigenschaft
Count, die die Anzahl der Songs in der Playlist zurückgibt - Eine Methode
GetAllSongs(), die alle Songs zurückgibt, verbunden durch" | "
Program.cs: Erstellen Sie in Ihrer Hauptdatei eine Playlist aus der Eingabe und verwenden Sie dann den Indexer, um auf Songs zuzugreifen und diese zu ändern. Demonstrieren Sie sowohl das Lesen von Songs nach Index als auch das Aktualisieren eines Songs an einer bestimmten Position.
Sie erhalten drei Eingaben:
- Eine kommagetrennte Liste von Songtiteln (z. B.
Song A,Song B,Song C) - Einen abzurufenden Index (Ganzzahl)
- Einen neuen Songtitel, der den Song an demselben Index ersetzt
Geben Sie die Ausgabe in diesem Format aus:
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}Wenn die Eingaben beispielsweise Rock Anthem,Jazz Vibes,Pop Hit, 1 und Blues Classic sind, sollte die Ausgabe wie folgt lauten:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop HitBeachten Sie, wie Sie mit dem Indexer auf playlist[1] zugreifen können, um "Jazz Vibes" abzurufen, und dann playlist[1] = "Blues Classic" zuweisen können, um ihn zu aktualisieren – viel natürlicher als der Aufruf von Methoden wie GetSongAt(1) oder SetSongAt(1, "Blues Classic")!
Spickzettel
Indexer ermöglichen es Ihnen, auf Elemente in Ihrer Klasse mit einer Array-ähnlichen Klammerschreibweise (collection[0]) anstelle von Methodenaufrufen zuzugreifen.
Definieren Sie einen Indexer mit dem Schlüsselwort this und eckigen Klammern:
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; }
}
}Anwendungsbeispiel:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#Indexer können jeden Typ als Indexparameter verwenden, nicht nur Ganzzahlen:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Wie Eigenschaften können Indexer schreibgeschützt sein (den Setter weglassen) oder Validierungslogik in ihren Accessoren enthalten.
Probier es selbst
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// Eingaben lesen
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: Erstelle ein Playlist-Objekt aus der songList
// TODO: Gib die Gesamtzahl der Songs unter Verwendung der Count-Eigenschaft aus
// TODO: Gib den Song am angegebenen Index unter Verwendung des Indexers aus
// TODO: Aktualisiere den Song am angegebenen Index unter Verwendung des Indexers
// TODO: Gib alle Songs nach der Aktualisierung unter Verwendung von GetAllSongs() aus
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten