เมธอดแบบ泛用
พารามิเตอร์ชนิดข้อมูลในเมธอด
เมธอดแบบ泛用 เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมธอดแบบเจเนริกคืออะไร
เมธอดแบบเจเนริกจะประกาศพารามิเตอร์ชนิดข้อมูลของตัวเองตั้งแต่หนึ่งรายการขึ้นไป โดยเขียนไว้ในวงเล็บมุมหลังชื่อเมธอด จากนั้นเนื้อหาเมธอดเดียวกันจะทำงานกับชนิดข้อมูลได้หลายชนิดโดยไม่ต้องแคสต์หรือเขียนโค้ดซ้ำ
พารามิเตอร์ชนิดข้อมูลเป็นตัวยึดตำแหน่ง เช่น T คอมไพเลอร์จะแทนที่ด้วยชนิดข้อมูลจริง ณ จุดเรียกใช้ ทำให้ชนิดข้อมูลยังคงถูกตรวจสอบอย่างเคร่งครัด
void Print<T>(T value)
{
Console.WriteLine(value);
}การประกาศพารามิเตอร์ชนิดข้อมูล
รายการพารามิเตอร์ชนิดข้อมูล <T> อยู่ระหว่างชื่อเมธอดกับรายการพารามิเตอร์ คุณสามารถใช้ T เป็นชนิดของพารามิเตอร์ ชนิดของค่าที่คืนกลับ หรือชนิดของตัวแปรภายในเนื้อหาเมธอดได้
ตามธรรมเนียม พารามิเตอร์ชนิดข้อมูลเดี่ยวมักตั้งชื่อว่า T และชื่อที่สื่อความหมายอย่าง TKey ก็พบได้บ่อยเช่นกัน
T Echo<T>(T input)
{
return input;
}การเรียกใช้พร้อมการอนุมานชนิดข้อมูล
โดยปกติคุณไม่จำเป็นต้องระบุอาร์กิวเมนต์ชนิดข้อมูลอย่างชัดเจน คอมไพเลอร์จะอนุมาน T จากอาร์กิวเมนต์ที่คุณส่งเข้าไป
ในที่นี้ Echo(42) อนุมานได้ว่า T = int และ Echo("hi") อนุมานได้ว่า T = string การอนุมานชนิดข้อมูลช่วยให้การเรียกใช้แบบทั่วไปกระชับและอ่านง่าย
using System;
class Program
{
static T Echo<T>(T input) => input;
static void Main()
{
Console.WriteLine(Echo(42));
Console.WriteLine(Echo("hi"));
}
}อาร์กิวเมนต์ชนิดข้อมูลอย่างชัดเจน
เมื่อการอนุมานไม่สามารถระบุชนิดข้อมูลได้ หรือเมื่อคุณต้องการระบุให้ชัดเจน ให้ระบุอาร์กิวเมนต์ชนิดข้อมูลในวงเล็บแหลม ณ จุดเรียกใช้
จำเป็นต้องทำเช่นนี้เมื่อไม่มีอาร์กิวเมนต์ใดมีชนิดข้อมูลนั้นอยู่ เช่น เมธอดที่มี T ปรากฏเฉพาะในชนิดข้อมูลผลลัพธ์
T Create<T>() where T : new() => new T();
// call:
var list = Create<int>();พารามิเตอร์ชนิดข้อมูลหลายรายการ
เมธอดแบบทั่วไปสามารถประกาศพารามิเตอร์ชนิดข้อมูลหลายรายการ โดยคั่นด้วยจุลภาค แต่ละรายการจะถูกอนุมานหรือระบุแยกจากกัน
ตัวอย่างคลาสสิกคือเครื่องมือสลับค่าหรือเครื่องมือสร้างคู่ข้อมูลที่ใช้ชนิดข้อมูลแตกต่างกันสองชนิด
(TSecond, TFirst) Flip<TFirst, TSecond>(TFirst a, TSecond b)
{
return (b, a);
}การสลับค่าแบบทั่วไป
เมธอดแบบทั่วไปเหมาะอย่างยิ่งกับเครื่องมือช่วยเหลือที่ไม่ขึ้นกับชนิดข้อมูลจริง การสลับค่าสามารถจัดลำดับค่าใหม่ให้กับค่าชนิดใดก็ได้ที่ตรงกัน
คีย์เวิร์ด ref ทำให้เมธอดสามารถแก้ไขตัวแปรของผู้เรียกได้โดยตรงในตำแหน่งเดิม
using System;
class Program
{
static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
static void Main()
{
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x} {y}");
}
}ข้อจำกัดของพารามิเตอร์เมธอด
เมธอดแบบทั่วไปสามารถจำกัดพารามิเตอร์ชนิดข้อมูลด้วยส่วนคำสั่ง where ข้อจำกัดจะบอกคอมไพเลอร์ว่าการดำเนินการใดบ้างที่อนุญาตให้ทำกับ T
ด้านล่างนี้ where T : IComparable<T> ทำให้สามารถเรียกใช้ CompareTo ในเนื้อหาเมธอดได้อย่างปลอดภัย
T Max<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) >= 0 ? a : b;
}เมธอดแบบทั่วไปในคลาสที่ไม่ใช่แบบทั่วไป
คลาสไม่จำเป็นต้องเป็นแบบทั่วไปจึงจะมีเมธอดแบบทั่วไปได้ คลาสเครื่องมือแบบคงที่มักใช้เก็บเมธอดเหล่านี้
วิธีนี้ช่วยจัดกลุ่มเครื่องมือช่วยเหลือที่ใช้งานได้ทั่วไปไว้ด้วยกัน โดยไม่บังคับให้ทั้งคลาสต้องมีพารามิเตอร์ชนิดข้อมูล
static class Util
{
public static T First<T>(T[] items) => items[0];
}การอนุมานจากอาร์เรย์
การอนุมานชนิดข้อมูลทำงานผ่านอาร์กิวเมนต์ที่เป็นอาร์เรย์และชุดข้อมูลได้เช่นกัน การส่ง int[] จะอนุมาน T = int ให้อัตโนมัติ
ทำให้อัลกอริทึมแบบทั่วไปให้ความรู้สึกเหมือนความสามารถในตัวของภาษา
using System;
class Program
{
static T First<T>(T[] items) => items[0];
static void Main()
{
int[] nums = { 10, 20, 30 };
Console.WriteLine(First(nums));
}
}เหตุใดจึงไม่ใช้ object เพียงอย่างเดียว
ก่อนมีการใช้งานแบบทั่วไป โค้ดจะใช้ object และการแปลงชนิด วิธีนั้นทำให้ความปลอดภัยของชนิดข้อมูลลดลง และทำให้ชนิดค่าเกิดการบรรจุค่า ซึ่งส่งผลเสียต่อประสิทธิภาพ
เมธอดแบบทั่วไปหลีกเลี่ยงการบรรจุค่าสำหรับชนิดค่า และตรวจพบข้อผิดพลาดของชนิดข้อมูลขณะคอมไพล์แทนที่จะโยนข้อผิดพลาดขณะทำงาน
// Unsafe: needs a cast and can fail at runtime
object Echo(object o) => o;
int n = (int)Echo(5);การส่งคืนชนิดข้อมูลที่แตกต่างกัน
ชนิดข้อมูลผลลัพธ์สามารถเป็นแบบทั่วไปได้เช่นกัน ทำให้เมธอดหนึ่งเมธอดสามารถกำหนดรูปร่างของผลลัพธ์ให้เหมาะกับผู้เรียก default(T) ให้ค่าศูนย์สำหรับชนิดค่า หรือให้ค่า null สำหรับชนิดอ้างอิง
วิธีนี้มีประโยชน์สำหรับค่าทดแทนที่ปลอดภัยเมื่อไม่มีค่าให้ใช้งาน
T OrDefault<T>(bool ok, T value)
{
return ok ? value : default(T);
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับเมธอดแบบทั่วไป
สรุปทบทวน
เมธอดแบบทั่วไปประกาศพารามิเตอร์ชนิดข้อมูลของตนเองในวงเล็บแหลมหลังชื่อ โดยปกติคอมไพเลอร์จะอนุมานชนิดข้อมูลจากอาร์กิวเมนต์ แต่คุณสามารถระบุชนิดข้อมูลนั้นอย่างชัดเจนได้
เมธอดเหล่านี้รักษาความปลอดภัยของชนิดข้อมูล หลีกเลี่ยงการบรรจุค่า และสามารถมีข้อจำกัด where ได้ คุณสามารถวางเมธอดเหล่านี้ไว้ในคลาสใดก็ได้ ไม่ว่าจะเป็นคลาสแบบทั่วไปหรือไม่ก็ตาม
คำถามที่พบบ่อย
บทเรียน “เมธอดแบบ泛用” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เมธอดแบบ泛用” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เมธอดแบบ泛用”
พารามิเตอร์ชนิดข้อมูลในเมธอด คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เมธอดแบบ泛用” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เมธอดแบบ泛用
- คลาสแบบ泛用
- ข้อจำกัด where
- อินเทอร์เฟซแบบ泛用