Tipi personalizzati che supportano gli intervalli
Aggiunga il supporto a Index e Range ai propri tipi.
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]); // 5Indicizzatore 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,3Il 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,30Perché 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]); // 40Risolvere 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]); // bRisolvere 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,4Count 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]); // 4Progettare 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,15Verifica 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
IndexeRange. - Il modello implicito: una proprietà
Count/Lengthinsieme aSlice(int, int). GetOffset(Length)eGetOffsetAndLength(Length)risolvono le posizioni dalla fine.
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
- Il tipo Index e l'operatore ^
- Il tipo Range e l'operatore ..
- Intervalli con array e stringhe
- Tipi personalizzati che supportano gli intervalli