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