Collection Builder
Unterstützen Sie Collection-Ausdrücke in eigenen Typen.
Collection Builder ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Benutzerdefinierte Typen in Collection-Ausdrücken
Collection-Ausdrücke sind nicht auf integrierte Typen beschränkt. Mit dem Attribut [CollectionBuilder] kann Ihr eigener Typ aus der Syntax [...] erstellt werden.
Das CollectionBuilder-Attribut
Sie wenden [CollectionBuilder(typeof(Factory), "Create")] auf Ihren Collection-Typ an. Damit benennen Sie eine statische Factory-Methode, die der Compiler zum Erstellen von Instanzen aufruft.
Signatur der Builder-Methode
Die Builder-Methode muss static sein, genau einen Parameter vom Typ ReadOnlySpan<T> annehmen und Ihren Collection-Typ zurückgeben. Der Compiler übergibt die Elemente als Span.
Eine minimale benutzerdefinierte Collection
Hier sehen Sie eine kleine unveränderliche Collection, die die Erstellung über Collection-Ausdrücke mithilfe eines Builders unterstützt.
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();Warum ReadOnlySpan?
Der Span-Parameter ermöglicht es dem Compiler, die Elemente ohne Zwischenallokation zu übergeben. Ihr Builder kopiert sie in den benötigten Speicher.
IEnumerable ist erforderlich
Der Collection-Typ muss IEnumerable<T> implementieren, wobei der Elementtyp mit dem Elementtyp des Spans übereinstimmt. So kann der Compiler den Elementtyp erkennen und die Verwendung überprüfen.
Generische Builder
Builder können generisch sein und dadurch MyCollection<T> unterstützen. Die Builder-Methode nimmt ReadOnlySpan<T> entgegen und gibt MyCollection<T> zurück.
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();Vorteil für unveränderliche Collections
Builder ermöglichen es den unveränderlichen Collections von .NET, etwa ImmutableArray<T>, Collection-Ausdrücke zu unterstützen. Der Builder erstellt die unveränderliche Instanz aus dem Span.
using System;
using System.Collections.Immutable;
ImmutableArray<int> nums = [1, 2, 3];
Console.WriteLine(nums.Length); // 3Spreads funktionieren ebenfalls
Sobald ein Typ über einen Builder verfügt, funktionieren Spreads automatisch innerhalb seiner Collection-Ausdrücke, da der Compiler weiterhin einen einzigen Span mit den Elementen erzeugt.
using System;
using System.Collections.Immutable;
ImmutableArray<int> a = [1, 2];
ImmutableArray<int> all = [..a, 3, 4];
Console.WriteLine(all.Length); // 4Wann Sie einen Builder hinzufügen sollten
Fügen Sie [CollectionBuilder] hinzu, wenn Sie eine benutzerdefinierte Collection bereitstellen und Aufrufern die kompakte Syntax [...] ermöglichen möchten, insbesondere bei unveränderlichen oder spezialisierten Containern.
Alles zusammenführen
Ein Builder besteht aus genau drei Teilen: dem Attribut, einem IEnumerable<T>-Typ und einer statischen Methode Create(ReadOnlySpan<T>). Damit wird Ihr Typ zu einem vollwertigen Ziel für Collection-Ausdrücke.
Kurzer Test
Überprüfen Sie die Anforderungen an einen Collection-Builder.
Zusammenfassung
Sie haben gelernt, wie benutzerdefinierte Typen Collection-Ausdrücke unterstützen.
- Wenden Sie
[CollectionBuilder(typeof(Factory), "Create")]auf den Typ an. - Die Factory ist eine
static-Methode, dieReadOnlySpan<T>entgegennimmt. - Der Typ muss
IEnumerable<T>implementieren. - So kann
ImmutableArray<T>die Syntax[...]akzeptieren.
Lerne C# mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 93
- Lektionen
- 346
Häufig gestellte Fragen
Ist die Lektion „Collection Builder“ kostenlos?
Ja — der vollständige Text von „Collection Builder“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Collection Builder“?
Unterstützen Sie Collection-Ausdrücke in eigenen Typen. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Collection Builder“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.