ตัวสร้างคอลเลกชัน
รองรับนิพจน์คอลเลกชันในชนิดข้อมูลแบบกำหนดเอง
ตัวสร้างคอลเลกชัน เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดกำหนดเองในนิพจน์คอลเลกชัน
นิพจน์คอลเลกชันไม่ได้จำกัดอยู่เฉพาะชนิดที่มีมาให้ในระบบ ด้วยแอตทริบิวต์ [CollectionBuilder] คุณสามารถสร้างชนิดของคุณเองจากไวยากรณ์ [...] ได้
แอตทริบิวต์ CollectionBuilder
คุณใช้ [CollectionBuilder(typeof(Factory), "Create")] กับชนิดคอลเลกชันของคุณ โดยระบุชื่อเมธอดโรงงานแบบสแตติกที่คอมไพเลอร์จะเรียกเพื่อสร้างอินสแตนซ์
ลายเซ็นของเมธอดตัวสร้าง
เมธอดตัวสร้างต้องเป็น static และรับพารามิเตอร์ ReadOnlySpan<T> เพียงตัวเดียว โดยคืนค่าชนิดคอลเลกชันของคุณ คอมไพเลอร์จะส่งองค์ประกอบมาในรูปสแปน
คอลเลกชันกำหนดเองแบบพื้นฐาน
นี่คือตัวอย่างคอลเลกชันที่เปลี่ยนแปลงไม่ได้ขนาดเล็ก ซึ่งเปิดใช้การสร้างผ่านนิพจน์คอลเลกชันด้วยตัวสร้าง
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();เหตุใดจึงใช้ ReadOnlySpan
พารามิเตอร์สแปนช่วยให้คอมไพเลอร์ส่งต่อองค์ประกอบได้โดยไม่ต้องจัดสรรหน่วยความจำระหว่างทาง ตัวสร้างของคุณจะคัดลอกองค์ประกอบเหล่านั้นไปยังพื้นที่จัดเก็บที่ต้องการ
ต้องเป็น IEnumerable
ชนิดคอลเลกชันต้องใช้ IEnumerable<T> (โดยชนิดองค์ประกอบต้องตรงกับชนิดองค์ประกอบของสแปน) เพื่อให้คอมไพเลอร์ทราบชนิดขององค์ประกอบและตรวจสอบการใช้งานได้
ตัวสร้างแบบ泛型
ตัวสร้างสามารถเป็นแบบ泛型และรองรับ MyCollection<T> ได้ เมธอดตัวสร้างจะรับ ReadOnlySpan<T> และคืนค่า 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();ประโยชน์ของคอลเลกชันที่เปลี่ยนแปลงไม่ได้
ตัวสร้างเป็นกลไกที่คอลเลกชันที่เปลี่ยนแปลงไม่ได้ของ .NET เช่น ImmutableArray<T> ใช้เพื่อรองรับนิพจน์คอลเลกชัน ตัวสร้างจะสร้างอินสแตนซ์ที่หยุดนิ่งจากสแปน
using System;
using System.Collections.Immutable;
ImmutableArray<int> nums = [1, 2, 3];
Console.WriteLine(nums.Length); // 3องค์ประกอบแบบกระจายก็ใช้ได้เช่นกัน
เมื่อชนิดมีตัวสร้างแล้ว องค์ประกอบแบบกระจายจะทำงานโดยอัตโนมัติภายในนิพจน์คอลเลกชันของชนิดนั้น เพราะคอมไพเลอร์ยังคงสร้างสแปนองค์ประกอบเพียงชุดเดียว
using System;
using System.Collections.Immutable;
ImmutableArray<int> a = [1, 2];
ImmutableArray<int> all = [..a, 3, 4];
Console.WriteLine(all.Length); // 4ควรเพิ่มตัวสร้างเมื่อใด
เพิ่ม [CollectionBuilder] เมื่อคุณเผยแพร่คอลเลกชันกำหนดเองและต้องการให้ผู้เรียกใช้ไวยากรณ์ [...] ที่กระชับได้ โดยเฉพาะกับคอนเทนเนอร์ที่เปลี่ยนแปลงไม่ได้หรือมีลักษณะเฉพาะ
นำทุกอย่างมารวมกัน
ตัวสร้างประกอบด้วยสามส่วน ได้แก่ แอตทริบิวต์ ชนิด IEnumerable<T> และเมธอด Create(ReadOnlySpan<T>) แบบสแตติก เมื่อมีครบแล้ว ชนิดของคุณจะเป็นเป้าหมายสำหรับนิพจน์คอลเลกชันได้อย่างสมบูรณ์
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ยืนยันข้อกำหนดของตัวสร้างคอลเลกชัน
สรุปทบทวน
คุณได้เรียนรู้ว่าชนิดกำหนดเองรองรับนิพจน์คอลเลกชันอย่างไร
- ใช้
[CollectionBuilder(typeof(Factory), "Create")]กับชนิดนั้น - โรงงานต้องเป็นเมธอด
staticที่รับReadOnlySpan<T> - ชนิดนั้นต้องใช้
IEnumerable<T> - นี่คือวิธีที่
ImmutableArray<T>รองรับ[...]
คำถามที่พบบ่อย
บทเรียน “ตัวสร้างคอลเลกชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวสร้างคอลเลกชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวสร้างคอลเลกชัน”
รองรับนิพจน์คอลเลกชันในชนิดข้อมูลแบบกำหนดเอง คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวสร้างคอลเลกชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ