0Pricing
C# Academy · บทเรียน

ตัวสร้างคอลเลกชัน

รองรับนิพจน์คอลเลกชันในชนิดข้อมูลแบบกำหนดเอง

ตัวสร้างคอลเลกชัน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ไวยากรณ์นิพจน์คอลเลกชัน
  2. องค์ประกอบกระจาย
  3. การอนุมานชนิดของคอลเลกชันจากเป้าหมาย
  4. ตัวสร้างคอลเลกชัน
← กลับไปที่ C# Academy