Aangepaste types die ranges ondersteunen
Voeg ondersteuning voor Index en Range toe aan uw types.
Aangepaste types die ranges ondersteunen is een gratis C# Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.
Twee manieren om indices en bereiken te ondersteunen
Je eigen typen kunnen ondersteuning voor de syntaxis van Index en Range krijgen. Er zijn twee manieren: expliciete indexeerders aanbieden, of een eigenschap Length/Count plus een methode Slice aanbieden.
Expliciete indexeerder voor Index
Voeg een indexeerder toe die System.Index accepteert; dan werkt de operator ^ direct met je type.
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]); // 5Expliciete indexeerder voor Range
Voeg voor ondersteuning van segmentering met .. een indexeerder toe die System.Range accepteert en het gewenste type segment retourneert.
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,3Het patroon Length + Slice
De compiler kan ondersteuning voor bereiken ook automatisch samenstellen als je type een eigenschap Count of Length en een methode Slice(int start, int length) heeft.
Het patroon implementeren
Hier stelt een aangepaste buffer Length en Slice beschikbaar. De compiler herschrijft buf[1..3] voor je naar buf.Slice(1, 2).
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,30Waarom Length belangrijk is
De eigenschap Length (of Count) zorgt ervoor dat de compiler indices vanaf het einde, zoals ^1, voor je type kan omzetten. Zonder deze eigenschap kan ^ niet worden vertaald.
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 handmatig omzetten
Roep in een Index-indexeerder i.GetOffset(Length) aan om een index die mogelijk vanaf het einde telt, om te zetten naar een gewone positie.
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 handmatig omzetten
Bij een Range-indexeerder geeft r.GetOffsetAndLength(Length) zowel het begin als het aantal te kopiëren elementen.
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 versus Length
Het patroon accepteert beide namen: arrays en spans gebruiken Length; List<T> gebruikt Count. Beide eigenschappen voldoen aan de vereisten van de compiler.
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]); // 4Retourtypen voor Slice ontwerpen
Bepaal of je Slice een kopie retourneert (zoals bij arrays) of een weergave (zoals bij spans). Weergaven zijn goedkoper, maar delen veranderbare toestand, dus leg je keuze vast in de documentatie.
Een compleet aangepast type
Dit type Sequence ondersteunt zowel ^ als .. via expliciete indexeerders en een eigenschap Length.
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,15Snelle controle
Bevestig wat bereiksyntaxis voor een aangepast type mogelijk maakt.
Samenvatting
Je hebt geleerd hoe je op twee manieren ondersteuning voor Index/Range aan je typen toevoegt.
- Expliciete indexeerders die
IndexenRangeaccepteren. - Het impliciete patroon: een eigenschap
Count/LengthplusSlice(int, int). GetOffset(Length)enGetOffsetAndLength(Length)zetten posities vanaf het einde om.
Leer C# met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 93
- Lessen
- 346
Veelgestelde vragen
Is de les “Aangepaste types die ranges ondersteunen” gratis?
Ja — de volledige tekst van “Aangepaste types die ranges ondersteunen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.
Wat leer ik in “Aangepaste types die ranges ondersteunen”?
Voeg ondersteuning voor Index en Range toe aan uw types. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C# Academy te beginnen?
Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Aangepaste types die ranges ondersteunen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C# Academy?
Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Het type Index en de operator ^
- Het type Range en de operator ..
- Ranges met arrays en strings
- Aangepaste types die ranges ondersteunen