Benutzerdefinierte Typen mit Range-Unterstützung
Fügen Sie eigenen Typen Unterstützung für Index und Range hinzu.
Benutzerdefinierte Typen mit Range-Unterstützung ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Zwei Möglichkeiten zur Unterstützung von Indizes und Bereichen
Ihre eigenen Typen können die Syntax für Index und Range unterstützen. Dafür gibt es zwei Vorgehensweisen: Stellen Sie explizite Indexer bereit oder eine Length- bzw. Count-Eigenschaft zusammen mit einer Slice-Methode.
Expliziter Index-Indexer
Fügen Sie einen Indexer hinzu, der System.Index akzeptiert, und der ^-Operator funktioniert automatisch für Ihren Typ.
using System;
class Deck {
private int[] cards = { 1, 2, 3, 4, 5 };
public int this[Index i] => cards[i];
}
var d = new Deck();
Console.WriteLine(d[^1]); // 5Expliziter Range-Indexer
Um das Ausschneiden mit .. zu unterstützen, fügen Sie einen Indexer hinzu, der System.Range akzeptiert und den gewünschten Ausschnittstyp zurückgibt.
using System;
class Deck {
private int[] cards = { 1, 2, 3, 4, 5 };
public int[] this[Range r] => cards[r];
}
var d = new Deck();
Console.WriteLine(string.Join(",", d[1..3])); // 2,3Das Length-Slice-Muster
Der Compiler kann die Unterstützung für Bereiche auch automatisch ableiten, wenn Ihr Typ eine Count- oder Length-Eigenschaft und eine Methode Slice(int start, int length) besitzt.
Das Muster implementieren
Hier stellt ein benutzerdefinierter Puffer Length und Slice bereit. Der Compiler schreibt buf[1..3] für Sie in buf.Slice(1, 2) um.
using System;
class Buffer {
private int[] data = { 10, 20, 30, 40 };
public int Length => data.Length;
public int this[int i] => data[i];
public int[] Slice(int start, int length) {
var result = new int[length];
Array.Copy(data, start, result, 0, length);
return result;
}
}
var buf = new Buffer();
Console.WriteLine(string.Join(",", buf[1..3])); // 20,30Warum Length wichtig ist
Die Eigenschaft Length (oder Count) ermöglicht es dem Compiler, vom Ende aus gezählte Indizes wie ^1 für Ihren Typ aufzulösen. Ohne sie kann ^ nicht übersetzt werden.
using System;
class Buffer {
private int[] data = { 10, 20, 30, 40 };
public int Length => data.Length;
public int this[Index i] => data[i.GetOffset(Length)];
}
var buf = new Buffer();
Console.WriteLine(buf[^1]); // 40Index manuell auflösen
Rufen Sie innerhalb eines Index-Indexers i.GetOffset(Length) auf, um einen möglicherweise vom Ende aus gezählten Index in einen einfachen Versatz umzuwandeln.
using System;
class Ring {
private string[] items = { "a", "b", "c" };
public int Length => items.Length;
public string this[Index i] {
get {
int offset = i.GetOffset(Length);
return items[offset];
}
}
}
var r = new Ring();
Console.WriteLine(r[^2]); // bRange manuell auflösen
Bei einem Range-Indexer liefert r.GetOffsetAndLength(Length) sowohl den Start als auch die Anzahl der zu kopierenden Elemente.
using System;
class Ring {
private int[] items = { 1, 2, 3, 4, 5 };
public int Length => items.Length;
public int[] this[Range r] {
get {
var (start, len) = r.GetOffsetAndLength(Length);
var slice = new int[len];
Array.Copy(items, start, slice, 0, len);
return slice;
}
}
}
var r = new Ring();
Console.WriteLine(string.Join(",", r[^3..^1])); // 3,4Count im Vergleich zu Length
Das Muster akzeptiert beide Namen: Arrays und Spans verwenden Length, List<T> verwendet Count. Beide Eigenschaften erfüllen die Anforderungen des Compilers.
using System;
using System.Collections.Generic;
var list = new List<int> { 1, 2, 3, 4 };
// List<T> has Count, so Index works:
Console.WriteLine(list[^1]); // 4Rückgabetypen für Slice entwerfen
Entscheiden Sie, ob Ihre Methode Slice eine Kopie (wie bei Arrays) oder eine Sicht (wie bei Spans) zurückgibt. Sichten sind günstiger, teilen aber veränderlichen Zustand. Dokumentieren Sie daher diese Entscheidung.
Ein vollständiger benutzerdefinierter Typ
Dieser Sequence-Typ unterstützt sowohl ^ als auch .. über explizite Indexer und eine Length-Eigenschaft.
using System;
class Sequence {
private int[] data;
public Sequence(int[] d) => data = d;
public int Length => data.Length;
public int this[Index i] => data[i];
public int[] this[Range r] => data[r];
}
var s = new Sequence(new[] { 5, 10, 15, 20 });
Console.WriteLine(s[^1]); // 20
Console.WriteLine(string.Join(",", s[1..^1])); // 10,15Schnelltest
Bestätigen Sie, wodurch die Bereichssyntax für einen benutzerdefinierten Typ ermöglicht wird.
Zusammenfassung
Sie haben zwei Möglichkeiten kennengelernt, Ihren Typen Unterstützung für Index/Range hinzuzufügen.
- Explizite Indexer, die
IndexundRangeakzeptieren. - Das implizite Muster: eine
Count- bzw.Length-Eigenschaft zusammen mitSlice(int, int). GetOffset(Length)undGetOffsetAndLength(Length)lösen vom Ende aus gezählte Positionen auf.
Lerne C# mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 93
- Lektionen
- 346
Häufig gestellte Fragen
Ist die Lektion „Benutzerdefinierte Typen mit Range-Unterstützung“ kostenlos?
Ja — der vollständige Text von „Benutzerdefinierte Typen mit Range-Unterstützung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Benutzerdefinierte Typen mit Range-Unterstützung“?
Fügen Sie eigenen Typen Unterstützung für Index und Range hinzu. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Benutzerdefinierte Typen mit Range-Unterstützung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Der Index-Typ und der ^-Operator
- Der Range-Typ und der ..-Operator
- Ranges mit Arrays und Zeichenfolgen
- Benutzerdefinierte Typen mit Range-Unterstützung