0Pricing
C# Academy · Lekcja

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); // 3

Elementy 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); // 4

Kiedy 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 static przyjmująca ReadOnlySpan<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

  1. Składnia wyrażeń kolekcji
  2. Element rozpakowywania
  3. Wnioskowanie typu docelowego kolekcji
  4. Konstruktory kolekcji
← Powrót do C# Academy