C# Indexer: Objekte wie Arrays indizieren
Was ist ein Indexer?
obj[index] angesprochen zu werden. Die Klasse verhält sich wie ein virtuelles Array.
Syntax (eindimensional)
public class Sample
{
private string[] data = new string[10];
public string this[int index] // Indexer-Name ist immer 'this'
{
get
{
if (index >= 0 && index < data.Length) return data[index];
return null; // oder Exception
}
set
{
if (index >= 0 && index < data.Length) data[index] = value;
}
}
}
Beispiel: Namensliste mit Indexer
public class IndexedNames
{
private const int Size = 10;
private string[] names = new string[Size];
public IndexedNames()
{
for (int i = 0; i < Size; i++) names[i] = "N.A.";
}
public string this[int index]
{
get => (index >= 0 && index < Size) ? names[index] : "";
set { if (index >= 0 && index < Size) names[index] = value; }
}
}
// Nutzung
var list = new IndexedNames();
list[0] = "Zara";
list[1] = "Riz";
for (int i = 0; i < IndexedNames.Size; i++)
Console.WriteLine(list[i]);
Überladene Indexer (Multiple Parameter / Andere Typen)
Indexer können überladen werden (unterschiedliche Parameter-Typen/Anzahl). Der Index muss nicht int sein.
Beispiel: String-Indexer für Lookup
public class IndexedNames
{
// ... (wie oben)
// Zweiter Indexer: Suche nach Name → Index
public int this[string name]
{
get
{
for (int i = 0; i < Size; i++)
if (names[i] == name) return i;
return -1; // nicht gefunden
}
}
}
// Nutzung
Console.WriteLine(list["Nuha"]); // Ausgabe: 2 (Index)
Mehrdimensionale Indexer
public class Matrix
{
private double[,] data = new double[3, 3];
public double this[int row, int col]
{
get => data[row, col];
set => data[row, col] = value;
}
}
var m = new Matrix();
m[1, 2] = 3.14;
Console.WriteLine(m[1, 2]);
Indexer vs. Properties
| Merkmal | Property | Indexer |
|---|---|---|
| Name | Benutzerdefiniert (Name) | Immer this |
| Parameter | Keine | Mindestens einer (Index) |
| Zugriff | obj.Prop | obj[index] |
| Überladbar | Nein | Ja |
| Statisch möglich | Ja | Nein (immer Instanzmember) |
Best Practices
- Index-Validierung (Bounds Checking) im Getter/Setter.
ArgumentOutOfRangeExceptionwerfen statt stillschweigendnull/Default zurückzugeben (außer Design erfordert es).this[int index]für listenartige Semantik; String-Indexer für Dictionary-ähnlichen Lookup.- Interface
IList<T>,IReadOnlyList<T>implementieren, wenn passend.
C Sprache
- C# Hello World – Ihre erste C#-Anwendung erstellen
- C# Keywords und Identifiers verstehen: Regeln, Listen und Best Practices
- C# Variablen & Primitive Datentypen meistern: Der komplette Guide
- C# Operatoren – Umfassender Leitfaden zu Operatoren in C#
- C# Bitweise und Bit-Shift-Operatoren meistern: Umfassender Leitfaden
- C# Grundlagen: Eingabe und Ausgabe Essentials
- C# Ausdrücke, Anweisungen & Blöcke: Umfassender Leitfaden mit Beispielen
- C# Kommentare meistern: Arten, Best Practices und XML-Dokumentation
- C# Switch Statement meistern: Syntax, Beispiele & Best Practices
- C# Ternärer Operator: Knapper Leitfaden zu bedingten Ausdrücken