0Pricing
C# Academy · Leçon

Types personnalisés prenant en charge les intervalles

Ajoutez la prise en charge de Index et Range à vos types.

Types personnalisés prenant en charge les intervalles est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Deux façons de prendre en charge les index et les intervalles

Vos propres types peuvent prendre en charge la syntaxe Index et Range. Deux approches sont possibles : fournir des indexeurs explicites ou fournir une propriété Length/Count ainsi qu’une méthode Slice.

Indexeur explicite pour un index

Ajoutez un indexeur qui accepte System.Index et l’opérateur ^ fonctionnera directement avec votre 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

Indexeur explicite pour Range

Pour prendre en charge l’extraction avec .., ajoutez un indexeur qui accepte System.Range et renvoie le type de portion souhaité.

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

Le modèle Length + Slice

Le compilateur peut également générer automatiquement la prise en charge des intervalles si votre type possède une propriété Count ou Length et une méthode Slice(int start, int length).

Implémenter le modèle

Ici, un tampon personnalisé expose Length et Slice. Le compilateur réécrit pour vous buf[1..3] en 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

Pourquoi Length est important

La propriété Length (ou Count) permet au compilateur de résoudre les index depuis la fin, comme ^1, sur votre type. Sans elle, ^ ne peut pas être interprété.

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

Résoudre manuellement un index

Dans un indexeur Index, appelez i.GetOffset(Length) pour convertir un index éventuellement situé depuis la fin en un simple décalage.

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

Résoudre manuellement un intervalle

Dans un indexeur Range, r.GetOffsetAndLength(Length) vous fournit à la fois le début et le nombre d’éléments à copier.

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 et Length

Le modèle accepte l’un ou l’autre nom : les tableaux et les segments mémoire utilisent Length ; List<T> utilise Count. L’une ou l’autre propriété suffit au compilateur.

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

Concevoir les types de retour de Slice

Décidez si votre Slice renvoie une copie, comme pour les tableaux, ou une vue, comme pour les segments mémoire. Les vues sont moins coûteuses, mais elles partagent un état modifiable ; documentez donc votre choix.

Un type personnalisé complet

Ce Sequence prend en charge ^ et .. grâce à des indexeurs explicites et à une propriété 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

Vérification rapide

Confirmez ce qui permet d’utiliser la syntaxe des intervalles avec un type personnalisé.

Récapitulatif

Vous avez appris deux façons d’ajouter la prise en charge de Index/Range à vos types.

  • Des indexeurs explicites qui acceptent Index et Range.
  • Le modèle implicite : une propriété Count/Length accompagnée de Slice(int, int).
  • GetOffset(Length) et GetOffsetAndLength(Length) résolvent les positions depuis la fin.

Questions Fréquemment Posées

La leçon « Types personnalisés prenant en charge les intervalles » est-elle gratuite ?

Oui — le texte complet de « Types personnalisés prenant en charge les intervalles » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Types personnalisés prenant en charge les intervalles » ?

Ajoutez la prise en charge de Index et Range à vos types. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Types personnalisés prenant en charge les intervalles » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Le type Index et l’opérateur ^
  2. Le type Range et l’opérateur ..
  3. Intervalles avec des tableaux et des chaînes
  4. Types personnalisés prenant en charge les intervalles
← Retour à C# Academy