Konstruktory kolekcji
Dodawaj obsługę wyrażeń kolekcji do własnych typów.
Konstruktory kolekcji to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Typy niestandardowe w wyrażeniach kolekcji
Wyrażenia kolekcji nie są ograniczone do typów wbudowanych. Dzięki atrybutowi [CollectionBuilder] można tworzyć własny typ za pomocą składni [...].
Atrybut CollectionBuilder
Atrybut [CollectionBuilder(typeof(Factory), "Create")] stosuje się do typu kolekcji. Wskazuje on statyczną metodę fabrykującą, którą kompilator wywołuje w celu utworzenia instancji.
Sygnatura metody konstruktora
Metoda konstruktora musi być static, przyjmować pojedynczy parametr typu ReadOnlySpan<T> i zwracać typ kolekcji. Kompilator przekazuje elementy jako span.
Minimalna kolekcja niestandardowa
Oto niewielka niezmienna kolekcja, która umożliwia tworzenie za pomocą wyrażeń kolekcji dzięki konstruktorowi.
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();Dlaczego ReadOnlySpan?
Parametr typu span pozwala kompilatorowi przekazać elementy bez pośredniej alokacji. Konstruktor kopiuje je do potrzebnego magazynu danych.
Musi implementować IEnumerable
Typ kolekcji musi implementować IEnumerable<T> (z typem elementów zgodnym z typem elementów spanu), aby kompilator znał typ elementów i mógł sprawdzać poprawność użycia.
Konstruktory generyczne
Konstruktory mogą być generyczne i obsługiwać typ MyCollection<T>. Metoda konstruktora przyjmuje ReadOnlySpan<T> i zwraca 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();Zaleta kolekcji niezmiennych
Konstruktory umożliwiają kolekcjom niezmiennym .NET, takim jak ImmutableArray<T>, obsługę wyrażeń kolekcji. Konstruktor tworzy zamrożoną instancję na podstawie spanu.
using System;
using System.Collections.Immutable;
ImmutableArray<int> nums = [1, 2, 3];
Console.WriteLine(nums.Length); // 3Elementy rozpraszające również działają
Gdy typ ma już konstruktor, elementy rozpraszające automatycznie działają w jego wyrażeniach kolekcji, ponieważ kompilator nadal tworzy pojedynczy span elementów.
using System;
using System.Collections.Immutable;
ImmutableArray<int> a = [1, 2];
ImmutableArray<int> all = [..a, 3, 4];
Console.WriteLine(all.Length); // 4Kiedy dodać konstruktor
Dodaj atrybut [CollectionBuilder], gdy udostępniasz niestandardową kolekcję i chcesz, aby jej użytkownicy mogli korzystać ze zwięzłej składni [...], szczególnie w przypadku niezmiennych lub wyspecjalizowanych kontenerów.
Zastosowanie w praktyce
Konstruktor składa się z trzech elementów: atrybutu, typu IEnumerable<T> oraz statycznej metody Create(ReadOnlySpan<T>). Dzięki nim typ staje się pełnoprawnym typem docelowym wyrażeń kolekcji.
Szybkie sprawdzenie
Sprawdź wymagania dotyczące konstruktora kolekcji.
Podsumowanie
Poznałeś sposób obsługi wyrażeń kolekcji przez typy niestandardowe.
- Zastosuj do typu atrybut
[CollectionBuilder(typeof(Factory), "Create")]. - Fabryka to metoda
staticprzyjmującaReadOnlySpan<T>. - Typ musi implementować
IEnumerable<T>. - W ten sposób typ
ImmutableArray<T>akceptuje składnię[...].
Często zadawane pytania
Czy lekcja „Konstruktory kolekcji” jest bezpłatna?
Tak — pełny tekst „Konstruktory kolekcji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Konstruktory kolekcji”?
Dodawaj obsługę wyrażeń kolekcji do własnych typów. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Konstruktory kolekcji”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Składnia wyrażeń kolekcji
- Element rozpakowywania
- Wnioskowanie typu docelowego kolekcji
- Konstruktory kolekcji