Samlingsbyggere
Støtt samlingsuttrykk i egendefinerte typer.
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); // 3Spredningselementer 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); // 4Nå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 tarReadOnlySpan<T>. - Typen må implementere
IEnumerable<T>. - Slik kan
ImmutableArray<T>godta[...].
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.