Constructores de colecciones
Admita expresiones de colección en tipos personalizados.
Constructores de colecciones es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
Tipos personalizados en expresiones de colección
Las expresiones de colección no están limitadas a los tipos integrados. Con el atributo [CollectionBuilder], puede crear su propio tipo mediante la sintaxis [...].
El atributo CollectionBuilder
Debe aplicar [CollectionBuilder(typeof(Factory), "Create")] al tipo de colección. Este atributo identifica un método de fábrica estático que el compilador llama para crear las instancias.
Firma del método de creación
El método de creación debe ser static, aceptar un único parámetro ReadOnlySpan<T> y devolver el tipo de su colección. El compilador pasa los elementos como un span.
Una colección personalizada mínima
A continuación se muestra una pequeña colección inmutable que habilita la creación mediante expresiones de colección a través de un método de creación.
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 qué ReadOnlySpan?
El parámetro de tipo span permite que el compilador entregue los elementos sin ninguna asignación intermedia. El método de creación los copia en el almacenamiento que necesite.
Debe ser IEnumerable
El tipo de colección debe implementar IEnumerable<T> (coincidiendo con el tipo de elemento del span) para que el compilador conozca el tipo de elemento y pueda validar el uso.
Métodos de creación genéricos
Los métodos de creación pueden ser genéricos y admitir MyCollection<T>. El método de creación acepta ReadOnlySpan<T> y devuelve 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();Ventaja para las colecciones inmutables
Los métodos de creación permiten que las colecciones inmutables de .NET, como ImmutableArray<T>, admitan expresiones de colección. El método de creación construye la instancia inmutable a partir del span.
using System;
using System.Collections.Immutable;
ImmutableArray<int> nums = [1, 2, 3];
Console.WriteLine(nums.Length); // 3Las propagaciones también funcionan
Una vez que un tipo tiene un método de creación, las propagaciones funcionan automáticamente dentro de sus expresiones de colección, porque el compilador sigue produciendo un único span de elementos.
using System;
using System.Collections.Immutable;
ImmutableArray<int> a = [1, 2];
ImmutableArray<int> all = [..a, 3, 4];
Console.WriteLine(all.Length); // 4Cuándo agregar un método de creación
Agregue un [CollectionBuilder] cuando distribuya una colección personalizada y quiera que sus usuarios disfruten de la sintaxis concisa [...], especialmente con contenedores inmutables o especializados.
Unir todos los conceptos
Un método de creación consta de solo tres piezas: el atributo, un tipo IEnumerable<T> y un método estático Create(ReadOnlySpan<T>). Con ellas, su tipo se convierte en un destino de primera clase para expresiones de colección.
Comprobación rápida
Confirme los requisitos de un método de creación de colecciones.
Resumen
Ha aprendido cómo los tipos personalizados admiten expresiones de colección.
- Aplique
[CollectionBuilder(typeof(Factory), "Create")]al tipo. - La fábrica es un método
staticque aceptaReadOnlySpan<T>. - El tipo debe implementar
IEnumerable<T>. - Así es como
ImmutableArray<T>acepta[...].
Preguntas frecuentes
¿La lección «Constructores de colecciones» es gratis?
Sí — el texto completo de «Constructores de colecciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Constructores de colecciones»?
Admita expresiones de colección en tipos personalizados. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Constructores de colecciones»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Sintaxis de expresiones de colección
- El elemento spread
- Tipado de colecciones según el destino
- Constructores de colecciones