0Pricing
C# Academy · Lezione

Collection builder

Supporti le espressioni di raccolta nei tipi personalizzati.

Collection builder è 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.

Tipi personalizzati nelle espressioni di raccolta

Le espressioni di raccolta non sono limitate ai tipi incorporati. Con l'attributo [CollectionBuilder], è possibile creare un tipo personalizzato usando la sintassi [...].

L'attributo CollectionBuilder

Si applica [CollectionBuilder(typeof(Factory), "Create")] al tipo della raccolta. In questo modo si indica un metodo factory statico che il compilatore chiamerà per creare le istanze.

Firma del metodo builder

Il metodo builder deve essere static e accettare un singolo parametro ReadOnlySpan<T>, restituendo il tipo della raccolta. Il compilatore passa gli elementi come span.

Una raccolta personalizzata minimale

Questa è una piccola raccolta immutabile che abilita la creazione tramite espressioni di raccolta usando un builder.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

[CollectionBuilder(typeof(IntBagBuilder), "Create")]
class IntBag : IEnumerable<int> {
    private readonly int[] items;
    public IntBag(ReadOnlySpan<int> data) => items = data.ToArray();
    public IEnumerator<int> GetEnumerator() => ((IEnumerable<int>)items).GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => items.GetEnumerator();
}

static class IntBagBuilder {
    public static IntBag Create(ReadOnlySpan<int> data) => new IntBag(data);
}

IntBag bag = [1, 2, 3];
foreach (int n in bag) Console.Write(n + " "); // 1 2 3
Console.WriteLine();

Perché ReadOnlySpan?

Il parametro span consente al compilatore di passare gli elementi senza allocazioni intermedie. Il builder li copia nella struttura di archiviazione di cui ha bisogno.

Deve implementare IEnumerable

Il tipo della raccolta deve implementare IEnumerable<T> (in corrispondenza del tipo degli elementi dello span), affinché il compilatore conosca il tipo degli elementi e possa convalidare l'utilizzo.

Builder generici

I builder possono essere generici e supportare MyCollection<T>. Il metodo builder accetta ReadOnlySpan<T> e restituisce MyCollection<T>.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

[CollectionBuilder(typeof(BoxBuilder), "Create")]
class Box<T> : IEnumerable<T> {
    private readonly T[] items;
    public Box(ReadOnlySpan<T> d) => items = d.ToArray();
    public IEnumerator<T> GetEnumerator() => ((IEnumerable<T>)items).GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => items.GetEnumerator();
}

static class BoxBuilder {
    public static Box<T> Create<T>(ReadOnlySpan<T> d) => new Box<T>(d);
}

Box<string> b = ["x", "y"];
foreach (var s in b) Console.Write(s + " "); // x y
Console.WriteLine();

Il vantaggio per le raccolte immutabili

I builder sono il meccanismo con cui le raccolte immutabili di .NET, come ImmutableArray<T>, supportano le espressioni di raccolta. Il builder costruisce l'istanza immutabile a partire dallo span.

using System;
using System.Collections.Immutable;

ImmutableArray<int> nums = [1, 2, 3];
Console.WriteLine(nums.Length); // 3

Funzionano anche le espansioni

Una volta che un tipo dispone di un builder, le espansioni funzionano automaticamente nelle sue espressioni di raccolta, perché il compilatore produce comunque un singolo span di elementi.

using System;
using System.Collections.Immutable;

ImmutableArray<int> a = [1, 2];
ImmutableArray<int> all = [..a, 3, 4];
Console.WriteLine(all.Length); // 4

Quando aggiungere un builder

Aggiunga [CollectionBuilder] quando distribuisce una raccolta personalizzata e vuole consentire ai chiamanti di usare la sintassi concisa [...], soprattutto per contenitori immutabili o specializzati.

Mettere insieme i concetti

Un builder è composto da tre elementi: l'attributo, un tipo IEnumerable<T> e un metodo statico Create(ReadOnlySpan<T>). Con questi elementi, il tipo diventa una destinazione a tutti gli effetti per le espressioni di raccolta.

Verifica rapida

Verifichi i requisiti di un builder per raccolte.

Riepilogo

Ha appreso come i tipi personalizzati supportano le espressioni di raccolta.

  • Applichi [CollectionBuilder(typeof(Factory), "Create")] al tipo.
  • La factory è un metodo static che accetta ReadOnlySpan<T>.
  • Il tipo deve implementare IEnumerable<T>.
  • È così che ImmutableArray<T> accetta [...].

Domande Frequenti

La lezione «Collection builder» è gratuita?

Sì — il testo completo di «Collection builder» è 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 «Collection builder»?

Supporti le espressioni di raccolta nei tipi personalizzati. 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 «Collection builder»?

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. Sintassi delle espressioni di raccolta
  2. L'elemento spread
  3. Inferenza del tipo di destinazione per le raccolte
  4. Collection builder
← Torna a C# Academy