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

คลาสแบบ泛用

ชนิดคอนเทนเนอร์ที่นำกลับมาใช้ได้

คลาสแบบ泛用 เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คลาสแบบทั่วไปคืออะไร

คลาสแบบทั่วไปจะประกาศพารามิเตอร์ชนิดข้อมูลอย่างน้อยหนึ่งรายการในวงเล็บแหลมหลังชื่อคลาส พารามิเตอร์เหล่านั้นสามารถใช้กับเขตข้อมูล พร็อพเพอร์ตี ลายเซ็นเมธอด และชนิดข้อมูลผลลัพธ์ได้ทั่วทั้งคลาส

วิธีนี้ช่วยให้คุณเขียนโครงสร้างเก็บข้อมูลหรือบริการเพียงหนึ่งชุดที่ทำงานกับชนิดข้อมูลสมาชิกได้หลายชนิด โดยยังคงตรวจสอบชนิดข้อมูลอย่างเข้มงวด

class Box<T>
{
    public T Value { get; set; }
}

การสร้างคลาสแบบทั่วไป

ในการสร้างอินสแตนซ์ คุณต้องระบุอาร์กิวเมนต์ชนิดข้อมูลจริง Box<int> และ Box<string> เป็นชนิดข้อมูลที่สร้างขึ้นคนละชนิดกัน

ชนิดข้อมูลที่สร้างขึ้นแต่ละชนิดจะทำงานเสมือนว่า T ถูกแทนที่ด้วยชนิดข้อมูลจริงในทุกตำแหน่ง

using System;

class Box<T> { public T Value { get; set; } }

class Program
{
    static void Main()
    {
        var b = new Box<int> { Value = 7 };
        Console.WriteLine(b.Value);
    }
}

เขตข้อมูลและพร็อพเพอร์ตีแบบทั่วไป

พารามิเตอร์ชนิดข้อมูลสามารถใช้เป็นชนิดข้อมูลของเขตข้อมูลและพร็อพเพอร์ตีได้ สแตก คิว หรือแคชมักเก็บข้อมูลไว้ในอาร์เรย์หรือรายการของ T

พื้นที่จัดเก็บภายในยังคงปลอดภัยด้านชนิดข้อมูลโดยไม่ต้องแปลงชนิด

class Pair<T>
{
    public T First;
    public T Second;
}

พารามิเตอร์ชนิดข้อมูลหลายรายการ

คลาสสามารถรับพารามิเตอร์ชนิดข้อมูลได้หลายรายการ ชนิดข้อมูลคู่คีย์/ค่าหรือชนิดข้อมูลรูปแบบพจนานุกรมมักใช้สองรายการ

ชื่อที่สื่อความหมาย เช่น TKey และ TValue ช่วยให้อ่านง่ายขึ้นเมื่อมีพารามิเตอร์มากกว่าหนึ่งรายการ

class Entry<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}

สแตกแบบทั่วไปอย่างง่าย

นี่คือตัวอย่างสแตกแบบทั่วไปขนาดเล็กที่สร้างบน List<T> โดย Push จะเพิ่มข้อมูลที่ส่วนท้าย และ Pop จะนำข้อมูลออกจากส่วนท้าย

คลาสเดียวกันนี้ใช้ได้กับจำนวนเต็ม สตริง หรือชนิดอ้างอิงและชนิดค่าใดก็ได้

using System;
using System.Collections.Generic;

class MyStack<T>
{
    private readonly List<T> items = new();
    public void Push(T item) => items.Add(item);
    public T Pop()
    {
        var i = items[^1];
        items.RemoveAt(items.Count - 1);
        return i;
    }
}

class Program
{
    static void Main()
    {
        var s = new MyStack<string>();
        s.Push("a");
        s.Push("b");
        Console.WriteLine(s.Pop());
    }
}

เมธอดแบบทั่วไปภายในคลาสแบบทั่วไป

คลาสแบบทั่วไปยังสามารถประกาศพารามิเตอร์ชนิดข้อมูลเพิ่มเติมในเมธอดแต่ละเมธอดได้ พารามิเตอร์ระดับเมธอดเหล่านี้เป็นอิสระจากพารามิเตอร์ระดับคลาส

วิธีนี้เพิ่มความยืดหยุ่น เช่น ทำให้สามารถแปลงชนิดข้อมูลที่จัดเก็บไว้เป็นชนิดข้อมูลอื่น

class Box<T>
{
    public T Value;
    public TOut Map<TOut>(Func<T, TOut> f) => f(Value);
}

ข้อจำกัดของคลาส

เช่นเดียวกับเมธอด คลาสแบบทั่วไปสามารถจำกัดพารามิเตอร์ชนิดข้อมูลด้วย where ข้อจำกัดจะมีผลกับสมาชิกทุกตัวที่ใช้พารามิเตอร์นั้น

ด้านล่างนี้ where T : class อนุญาตให้กำหนดค่า null และเปรียบเทียบการอ้างอิงได้

class Repository<T> where T : class
{
    private T current;
    public bool IsEmpty => current is null;
}

สมาชิกคงที่แยกตามชนิดข้อมูล

ชนิดข้อมูลแบบทั่วไปที่สร้างขึ้นแต่ละชนิดจะมีสำเนาของเขตข้อมูลคงที่แยกเป็นของตนเอง Counter<int> และ Counter<string> จะติดตามจำนวนแยกจากกัน

นี่เป็นความแตกต่างเล็กน้อยแต่สำคัญเมื่อเทียบกับคลาสที่ไม่ใช่แบบทั่วไป

class Counter<T>
{
    public static int Count;
}

ค่าเริ่มต้นในคลาสแบบทั่วไป

ภายในคลาสแบบทั่วไป คุณมักต้องการค่าเริ่มต้นสำหรับเขตข้อมูลชนิด T ให้ใช้ default(T) หรือใช้ default รูปแบบสั้นกว่าเมื่อบริบทระบุชนิดข้อมูลไว้แล้ว

คำสั่งนี้ให้ค่า null สำหรับชนิดอ้างอิง และให้ค่าศูนย์สำหรับชนิดค่า

class Slot<T>
{
    public T Value = default!;
    public bool HasValue { get; private set; }
}

การสืบทอดจากคลาสแบบทั่วไป

คุณสามารถสืบทอดจากคลาสฐานแบบทั่วไปได้ คลาสย่อยอาจกำหนดอาร์กิวเมนต์ชนิดข้อมูลให้ตายตัว หรือยังคงเป็นคลาสแบบทั่วไปต่อไป

การกำหนดให้ตายตัวจะทำให้คลาสฐานมีความเฉพาะเจาะจง ส่วนการยังคงเป็นแบบทั่วไปจะส่งต่อพารามิเตอร์ขึ้นไป

class Box<T> { public T Value; }

class IntBox : Box<int> { }

class NamedBox<T> : Box<T> { public string Name; }

แบบทั่วไปกับชุดข้อมูลในตัว

คลังโปรแกรมพื้นฐานของ .NET เต็มไปด้วยคลาสแบบทั่วไป เช่น List<T>, Dictionary<TKey, TValue> และ Queue<T> สิ่งเหล่านี้คือประโยชน์ที่พบได้ในชีวิตประจำวันจากการออกแบบคลาสแบบทั่วไป

การเขียนชนิดข้อมูลแบบทั่วไปของคุณเองช่วยให้คุณขยายรูปแบบที่ปลอดภัยและนำกลับมาใช้ใหม่นี้ได้

using System.Collections.Generic;

var scores = new Dictionary<string, int>();
scores["ada"] = 95;

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับคลาสแบบทั่วไป

สรุปทบทวน

คลาสแบบทั่วไปประกาศพารามิเตอร์ชนิดข้อมูลหลังชื่อคลาส และใช้พารามิเตอร์เหล่านั้นกับเขตข้อมูล พร็อพเพอร์ตี และเมธอด คุณสร้างคลาสเหล่านี้ด้วยอาร์กิวเมนต์ชนิดข้อมูลจริง ทำให้เกิดชนิดข้อมูลที่แยกจากกัน

คลาสเหล่านี้สามารถเพิ่มพารามิเตอร์ชนิดข้อมูลระดับเมธอด มีข้อจำกัด where สืบทอดต่อได้ และเก็บสถานะคงที่แยกตามชนิดข้อมูล ชุดข้อมูลในตัวเป็นตัวอย่างสำคัญที่สุด

คำถามที่พบบ่อย

บทเรียน “คลาสแบบ泛用” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คลาสแบบ泛用” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คลาสแบบ泛用”

ชนิดคอนเทนเนอร์ที่นำกลับมาใช้ได้ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “คลาสแบบ泛用” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เมธอดแบบ泛用
  2. คลาสแบบ泛用
  3. ข้อจำกัด where
  4. อินเทอร์เฟซแบบ泛用
← กลับไปที่ C# Academy