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

ข้อจำกัด where

จำกัดพารามิเตอร์ชนิดข้อมูล

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

เหตุผลที่มีข้อจำกัด

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

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

void Show<T>(T value) where T : IFormattable
{
    // now ToString(format, provider) is available
}

ข้อจำกัดด้านอินเทอร์เฟซ

ข้อจำกัดด้านอินเทอร์เฟซกำหนดให้ T ต้องนำอินเทอร์เฟซที่ระบุไปใช้ จากนั้นเนื้อหาเมธอดจึงสามารถเรียกใช้สมาชิกของอินเทอร์เฟซนั้นได้

ด้านล่างนี้ where T : IComparable<T> รับรองว่ามีเมธอด CompareTo อยู่

T Max<T>(T a, T b) where T : IComparable<T>
    => a.CompareTo(b) >= 0 ? a : b;

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

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

วิธีนี้พบได้บ่อยในกรอบงานที่เอนทิตีทั้งหมดใช้ชนิดข้อมูลฐานร่วมกัน

class Animal { public string Name = ""; }

string NameOf<T>(T a) where T : Animal => a.Name;

ข้อจำกัดด้านชนิดอ้างอิง

where T : class กำหนดให้ T เป็นชนิดอ้างอิง ข้อจำกัดนี้อนุญาตให้กำหนดค่า null และตรวจสอบความเท่ากันของการอ้างอิงได้

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

T? FindOrNull<T>(bool found, T value) where T : class
    => found ? value : null;

ข้อจำกัดด้านชนิดค่า

where T : struct กำหนดให้ T เป็นชนิดค่าที่ไม่สามารถเป็นค่าว่างได้ วิธีนี้ทำให้คุณปฏิบัติต่อ T เป็นชนิดค่า และใช้ T? เป็นชนิดค่าที่อาจเป็นค่าว่างได้

ใช้กับเครื่องมือช่วยเหลือที่ทำงานเฉพาะกับตัวเลข ค่าแจกแจง หรือโครงสร้างข้อมูลขนาดเล็ก

T? AsNullable<T>(T value) where T : struct
    => value;

ข้อจำกัดด้านตัวสร้างแบบไม่มีพารามิเตอร์

ข้อจำกัด new() กำหนดให้ T มีตัวสร้างแบบไม่มีพารามิเตอร์ที่เป็นสาธารณะ จากนั้นเนื้อหาเมธอดจะสามารถเขียน new T() ได้

โรงงานสร้างวัตถุและกลุ่มวัตถุอาศัยข้อจำกัดนี้เพื่อสร้างอินสแตนซ์แบบทั่วไป

using System;

class Program
{
    static T Make<T>() where T : new() => new T();

    static void Main()
    {
        var list = Make<System.Collections.Generic.List<int>>();
        Console.WriteLine(list.Count);
    }
}

การรวมข้อจำกัด

คุณสามารถใช้ข้อจำกัดหลายรายการกับพารามิเตอร์หนึ่งรายการได้ กฎการจัดลำดับกำหนดให้ class หรือ struct อยู่ก่อน จากนั้นเป็นคลาสฐาน แล้วจึงเป็นอินเทอร์เฟซ และให้ new() อยู่ท้ายสุด

ข้อจำกัดเหล่านี้จะแสดงหลัง where เพียงรายการเดียว โดยคั่นด้วยจุลภาค

T Build<T>() where T : class, IComparable<T>, new()
    => new T();

ส่วนคำสั่ง where หลายรายการ

เมื่อเมธอดหรือคลาสมีพารามิเตอร์ชนิดข้อมูลหลายรายการ แต่ละรายการจะมีส่วนคำสั่ง where ของตนเอง โดยเขียนต่อกันทีละรายการ

วิธีนี้ช่วยแยกข้อจำกัดของพารามิเตอร์แต่ละรายการให้เห็นได้อย่างชัดเจน

TResult Convert<TInput, TResult>(TInput x)
    where TInput : class
    where TResult : new()
    => new TResult();

ตัวอย่างข้อจำกัดที่ทำงานได้จริง

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

ข้อจำกัดนี้เองที่ทำให้การเรียกใช้ CompareTo ภายในเมธอดถูกต้องตามกฎ

using System;

class Program
{
    static T Max<T>(T a, T b) where T : IComparable<T>
        => a.CompareTo(b) >= 0 ? a : b;

    static void Main()
    {
        Console.WriteLine(Max(3, 9));
        Console.WriteLine(Max("apple", "pear"));
    }
}

ข้อจำกัด notnull และ unmanaged

C# รุ่นใหม่เพิ่มข้อจำกัดเข้ามาอีกหลายรายการ where T : notnull ห้ามใช้ชนิดข้อมูลที่อาจเป็นค่าว่าง ซึ่งมีประโยชน์สำหรับคีย์ของพจนานุกรม ส่วน where T : unmanaged จำกัด T ให้เป็นชนิดค่าที่สามารถวางรูปแบบในหน่วยความจำได้โดยตรงสำหรับโค้ดระดับต่ำ

ข้อจำกัดเหล่านี้ช่วยเพิ่มความปลอดภัยในสถานการณ์เฉพาะทาง

void Use<T>(T key) where T : notnull { }

unsafe void Raw<T>(T v) where T : unmanaged { }

ข้อจำกัดช่วยเพิ่มความสามารถ ไม่ได้ลดทอนพลัง

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

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

// No constraint: only object members available
string Name<T>(T x) => x.ToString();

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

ทดสอบความเข้าใจของคุณเกี่ยวกับข้อจำกัด where

สรุปทบทวน

ส่วนคำสั่ง where ใช้จำกัดพารามิเตอร์ชนิดข้อมูลด้วยข้อจำกัดด้านอินเทอร์เฟซ คลาสฐาน class struct new() notnull และ unmanaged ข้อจำกัดแต่ละรายการจะปลดล็อกการดำเนินการเฉพาะอย่างบน T

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

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

บทเรียน “ข้อจำกัด where” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ข้อจำกัด where”

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

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

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

บทเรียน “ข้อจำกัด where” ใช้เวลานานแค่ไหน

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

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

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

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

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