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