C# Academy · Les

Aangepaste types die ranges ondersteunen

Voeg ondersteuning voor Index en Range toe aan uw types.

Les 4 van 413 stappen

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]); // 5

Expliciete 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,3

Het 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,30

Waarom 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]); // 40

Index 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]); // b

Range 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,4

Count 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]); // 4

Retourtypen 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,15

Snelle 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 Index en Range accepteren.
  • Het impliciete patroon: een eigenschap Count/Length plus Slice(int, int).
  • GetOffset(Length) en GetOffsetAndLength(Length) zetten posities vanaf het einde om.
Gratis beginnen

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

  1. Het type Index en de operator ^
  2. Het type Range en de operator ..
  3. Ranges met arrays en strings
  4. Aangepaste types die ranges ondersteunen
← Terug naar C# Academy