Construtores de coleções
Dê suporte a expressões de coleção em tipos personalizados.
Construtores de coleções é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
Tipos personalizados em expressões de coleção
As expressões de coleção não se limitam aos tipos integrados. Com a anotação [CollectionBuilder], seu próprio tipo pode ser criado usando a sintaxe [...].
A anotação CollectionBuilder
Você aplica [CollectionBuilder(typeof(Factory), "Create")] ao seu tipo de coleção. Ela identifica um método de fábrica estático que o compilador chama para construir instâncias.
Assinatura do método construtor
O método construtor deve ser static e receber um único parâmetro ReadOnlySpan<T>, retornando o tipo da sua coleção. O compilador passa os elementos como um intervalo.
Uma coleção personalizada mínima
Aqui está uma pequena coleção imutável que habilita a criação por expressões de coleção por meio de um construtor.
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();Por que usar ReadOnlySpan?
O parâmetro de intervalo permite que o compilador transfira os elementos sem uma alocação intermediária. Seu construtor os copia para o armazenamento necessário.
Deve implementar uma sequência enumerável
O tipo de coleção precisa implementar IEnumerable<T> (correspondente ao tipo de elemento do intervalo) para que o compilador conheça o tipo de elemento e possa validar o uso.
Construtores genéricos
Os construtores podem ser genéricos, dando suporte a MyCollection<T>. O método construtor recebe ReadOnlySpan<T> e retorna 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();Vantagem das coleções imutáveis
Os construtores permitem que as coleções imutáveis do .NET, como ImmutableArray<T>, deem suporte a expressões de coleção. O construtor cria a instância imutável a partir do intervalo.
using System;
using System.Collections.Immutable;
ImmutableArray<int> nums = [1, 2, 3];
Console.WriteLine(nums.Length); // 3As expansões também funcionam
Depois que um tipo tem um construtor, as expansões funcionam automaticamente dentro de suas expressões de coleção, pois o compilador continua produzindo um único intervalo de elementos.
using System;
using System.Collections.Immutable;
ImmutableArray<int> a = [1, 2];
ImmutableArray<int> all = [..a, 3, 4];
Console.WriteLine(all.Length); // 4Quando adicionar um construtor
Adicione uma anotação [CollectionBuilder] ao distribuir uma coleção personalizada e desejar que os chamadores aproveitem a sintaxe concisa [...], especialmente para contêineres imutáveis ou especializados.
Combinando tudo
Um construtor consiste em apenas três partes: a anotação, um tipo IEnumerable<T> e um método estático Create(ReadOnlySpan<T>). Com isso, seu tipo se torna um destino de primeira classe para expressões de coleção.
Verificação rápida
Confirme os requisitos de um construtor de coleção.
Recapitulação
Você aprendeu como os tipos personalizados dão suporte a expressões de coleção.
- Aplique
[CollectionBuilder(typeof(Factory), "Create")]ao tipo. - A fábrica é um método
staticque recebeReadOnlySpan<T>. - O tipo deve implementar
IEnumerable<T>. - É assim que
ImmutableArray<T>aceita[...].
Perguntas Frequentes
A aula “Construtores de coleções” é grátis?
Sim — o texto completo de “Construtores de coleções” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Construtores de coleções”?
Dê suporte a expressões de coleção em tipos personalizados. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Construtores de coleções”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Sintaxe de expressões de coleção
- O elemento de expansão
- Tipagem pelo destino em coleções
- Construtores de coleções