C# Academy · Lezione

Tipi personalizzati che supportano gli intervalli

Aggiunga il supporto a Index e Range ai propri tipi.

Lezione 4 di 413 passaggi

Tipi personalizzati che supportano gli intervalli è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Due modi per supportare indici e intervalli

I suoi tipi possono supportare la sintassi di Index e Range. Esistono due approcci: fornire indicizzatori espliciti oppure fornire una proprietà Length/Count insieme a un metodo Slice.

Indicizzatore esplicito per Index

Aggiunga un indicizzatore che accetti System.Index e l'operatore ^ funzionerà direttamente sul suo tipo.

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

Indicizzatore esplicito per Range

Per supportare la selezione tramite .., aggiunga un indicizzatore che accetti System.Range e restituisca il tipo di porzione desiderato.

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

Il modello Length + Slice

Il compilatore può anche generare automaticamente il supporto agli intervalli se il tipo dispone di una proprietà Count o Length e di un metodo Slice(int start, int length).

Implementare il modello

Qui un buffer personalizzato espone Length e Slice. Il compilatore riscrive automaticamente buf[1..3] come 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

Perché Length è importante

La proprietà Length (o Count) consente al compilatore di risolvere gli indici dalla fine, come ^1, sul suo tipo. Senza di essa, ^ non può essere tradotto.

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

Risolvere manualmente un Index

All'interno di un indicizzatore Index, chiami i.GetOffset(Length) per convertire un indice, eventualmente dalla fine, in un semplice offset.

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

Risolvere manualmente un Range

Per un indicizzatore Range, r.GetOffsetAndLength(Length) fornisce sia l'inizio sia il conteggio degli elementi da copiare.

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

Il modello accetta entrambi i nomi: array e span utilizzano Length, mentre List<T> utilizza Count. Entrambe le proprietà soddisfano i requisiti del compilatore.

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

Progettare i tipi restituiti da Slice

Decida se il suo Slice restituisce una copia, come gli array, oppure una vista, come gli span. Le viste sono più economiche, ma condividono lo stato mutabile: documenti quindi questa scelta.

Un tipo personalizzato completo

Questo Sequence supporta sia ^ sia .. tramite indicizzatori espliciti e una proprietà 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

Verifica rapida

Confermi quali elementi abilitano la sintassi degli intervalli su un tipo personalizzato.

Riepilogo

Ha imparato due modi per aggiungere il supporto a Index/Range ai propri tipi.

  • Indicizzatori espliciti che accettano Index e Range.
  • Il modello implicito: una proprietà Count/Length insieme a Slice(int, int).
  • GetOffset(Length) e GetOffsetAndLength(Length) risolvono le posizioni dalla fine.
Gratis per iniziare

Impara C# con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
93
Lezioni
346

Domande Frequenti

La lezione «Tipi personalizzati che supportano gli intervalli» è gratuita?

Sì — il testo completo di «Tipi personalizzati che supportano gli intervalli» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Tipi personalizzati che supportano gli intervalli»?

Aggiunga il supporto a Index e Range ai propri tipi. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Tipi personalizzati che supportano gli intervalli»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Il tipo Index e l'operatore ^
  2. Il tipo Range e l'operatore ..
  3. Intervalli con array e stringhe
  4. Tipi personalizzati che supportano gli intervalli
← Torna a C# Academy