Indexer (this[])
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 37 von 70.
Indexer ermöglichen dir den Zugriff auf Elemente in deiner Klasse mithilfe einer arrayähnlichen Klammerschreibweise. Statt eine Methode wie collection.GetItem(0) aufzurufen, kannst du die intuitivere Schreibweise collection[0] verwenden.
Du definierst 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; }
}
}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. Du kannst jeden Typ als Indexparameter verwenden, wodurch sie für den Zugriff ähnlich wie bei einem Wörterbuch nützlich sind:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Wie Eigenschaften können Indexer schreibgeschützt sein (wobei der Setter weggelassen wird) oder Validierungslogik in ihren Zugriffsmethoden enthalten. Sie eignen sich ideal, wenn deine Klasse eine Sammlung kapselt oder wenn die Klammersyntax den Code lesbarer macht.
Aufgabe
EinfachLass uns eine Playlist-Klasse erstellen, mit der du über eine intuitive Klammernotation auf Songs zugreifen kannst, genau wie bei der Arbeit mit einem Array. Du erstellst eine Musik-Playlist, in der Songs anhand ihrer Position mithilfe eines Indexers abgerufen und aktualisiert werden können.
Du wirst deinen Code auf zwei Dateien aufteilen:
Playlist.cs: Erstelle einePlaylist-Klasse im NamespaceMusic, die eine interne Sammlung von Songs kapselt und über einen Indexer arrayähnlichen Zugriff ermöglicht. Deine Playlist sollte Folgendes enthalten:- Ein privates String-Array zum Speichern der Songtitel
- Einen Konstruktor, der eine durch Kommas getrennte Zeichenfolge von Songtiteln akzeptiert und sie in das interne Array aufteilt
- Einen Indexer mit
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, verbunden durch" | ", zurückgibt
Program.cs: Erstelle in deiner Hauptdatei eine Playlist aus der Eingabe und verwende anschließend den Indexer, um Songs abzurufen und zu ändern. Zeige sowohl das Lesen von Songs anhand ihres Index als auch das Aktualisieren eines Songs an einer bestimmten Position.
Du erhältst drei Eingaben:
- Eine durch Kommas getrennte 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
Gib 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 lauten, sollte die Ausgabe wie folgt aussehen:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop HitBeachte, wie der Indexer dir ermöglicht, auf playlist[1] zuzugreifen, um "Jazz Vibes" abzurufen, und anschließend playlist[1] = "Blues Classic" zuzuweisen, um den Song zu aktualisieren – viel natürlicher, als Methoden wie GetSongAt(1) oder SetSongAt(1, "Blues Classic") aufzurufen!
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. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler