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

เมธอดแบบ泛用

พารามิเตอร์ชนิดข้อมูลในเมธอด

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

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

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