C# Academy · leksjon

Samlingsbyggere

Støtt samlingsuttrykk i egendefinerte typer.

Leksjon 4 av 413 trinn

Samlingsbyggere er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.

Egne typer i samlingsuttrykk

Samlingsuttrykk er ikke begrenset til innebygde typer. Med attributtet [CollectionBuilder] kan din egen type opprettes med syntaksen [...].

Attributtet CollectionBuilder

Du bruker [CollectionBuilder(typeof(Factory), "Create")] på samlingstypen din. Det angir en statisk fabrikkmetode som kompilatoren kaller for å bygge instanser.

Signaturen til byggermetoden

Byggermetoden må være static og ta én parameter av typen ReadOnlySpan<T>, og den må returnere samlingstypen din. Kompilatoren sender elementene som et span.

En minimal egendefinert samling

Her er en liten uforanderlig samling som støtter oppretting med samlingsuttrykk via en bygger.

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();

Hvorfor ReadOnlySpan?

Span-parameteren lar kompilatoren overføre elementene uten mellomliggende allokering. Byggeren kopierer dem til den lagringen den trenger.

Den må være IEnumerable

Samlingstypen må implementere IEnumerable<T> (med samme elementtype som spanet), slik at kompilatoren kjenner elementtypen og kan validere bruken.

Generiske byggere

Byggere kan være generiske og støtte MyCollection<T>. Byggermetoden tar ReadOnlySpan<T> og returnerer 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();

Fordelen med uforanderlige samlinger

Byggere gjør at de uforanderlige samlingene i .NET, for eksempel ImmutableArray<T>, kan støtte samlingsuttrykk. Byggeren oppretter den frosne instansen fra spanet.

using System;
using System.Collections.Immutable;

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

Spredningselementer fungerer også

Når en type har en bygger, fungerer spredningselementer automatisk i samlingsuttrykkene, fordi kompilatoren fortsatt produserer ett enkelt span med elementer.

using System;
using System.Collections.Immutable;

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

Når bør du legge til en bygger

Legg til [CollectionBuilder] når du leverer en egendefinert samling og vil at kallere skal kunne bruke den korte syntaksen [...], særlig for uforanderlige eller spesialiserte beholdere.

Slik henger det sammen

En bygger består bare av tre deler: attributtet, en type som implementerer IEnumerable<T>, og en statisk metode Create(ReadOnlySpan<T>). Med disse delene blir typen din en fullverdig måltype for samlingsuttrykk.

Hurtigsjekk

Kontroller kravene til en samlingsbygger.

Oppsummering

Du har lært hvordan egendefinerte typer støtter samlingsuttrykk.

  • Bruk [CollectionBuilder(typeof(Factory), "Create")] på typen.
  • Fabrikkmetoden er en static-metode som tar ReadOnlySpan<T>.
  • Typen må implementere IEnumerable<T>.
  • Slik kan ImmutableArray<T> godta [...].
Gratis å komme i gang

Lær deg C# med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
93
Leksjoner
346

Ofte stilte spørsmål

Er leksjonen «Samlingsbyggere» gratis?

Ja – hele teksten i «Samlingsbyggere» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Samlingsbyggere»?

Støtt samlingsuttrykk i egendefinerte typer. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C# Academy?

Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Samlingsbyggere»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?

Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Syntaks for samlingsuttrykk
  2. Spredningselementet
  3. Målangivelse av samlinger
  4. Samlingsbyggere
← Tilbake til C# Academy