นิพจน์ switch
switch ที่ส่งคืนค่าอย่างกระชับ
นิพจน์ switch เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
นิพจน์สวิตช์คืออะไร
นิพจน์สวิตช์จะนำข้อมูลเข้าไปตรวจสอบกับรูปแบบต่าง ๆ ตามลำดับ แล้วคืนค่าออกมา แตกต่างจากคำสั่งสวิตช์แบบดั้งเดิมตรงที่นิพจน์สวิตช์เป็นนิพจน์ จึงสร้างผลลัพธ์ที่คุณสามารถกำหนดให้ตัวแปรหรือส่งคืนได้
นิพจน์นี้ใช้คีย์เวิร์ด switch ต่อท้ายค่า โดยเขียนแขนงในรูปแบบ pattern => result ทำให้ตรรกะการแตกแขนงกระชับและมีลักษณะเชิงฟังก์ชัน
int code = 2;
string name = code switch
{
1 => "One",
2 => "Two",
_ => "Other"
};
System.Console.WriteLine(name);คำสั่งกับนิพจน์
คำสั่งสวิตช์แบบเก่าใช้ป้ายกำกับ case และ break ส่วนนิพจน์สวิตช์แบบใหม่จะไม่ใช้คีย์เวิร์ดเหล่านี้เลย
แขนงคั่นด้วยจุลภาค ทั้งชุดลงท้ายด้วยอัฒภาค และแขนงแต่ละแขนงจะให้ค่าแทนการทำงานเป็นบล็อกที่ไหลต่อกัน วิธีนี้ช่วยกำจัดข้อผิดพลาดทั้งกลุ่มที่เกิดจากการลืมเขียน break
// Statement style
switch (code) { case 1: result = "One"; break; }
// Expression style
result = code switch { 1 => "One", _ => "?" };แขนงละทิ้ง
ขีดล่าง _ คือรูปแบบละทิ้ง ซึ่งตรงกับทุกสิ่งและทำหน้าที่เป็นกรณีเริ่มต้น
นิพจน์สวิตช์ต้องครอบคลุมทุกกรณี หากขณะทำงานไม่มีแขนงใดตรงกัน ระบบจะโยน SwitchExpressionException การเพิ่มแขนง _ จะรับประกันว่ามีแขนงตรงกับข้อมูลเข้าที่เป็นไปได้ทุกค่า
using System;
class Program {
static void Main() {
int n = 7;
string size = n switch {
< 5 => "small",
_ => "big"
};
Console.WriteLine(size);
}
}รูปแบบค่าคงที่
แขนงที่ง่ายที่สุดใช้รูปแบบค่าคงที่ ซึ่งเป็นค่าตามตัวอักษรที่นำข้อมูลเข้าไปเปรียบเทียบด้วยความเท่ากัน
ค่าคงที่อาจเป็นตัวเลข สตริง อักขระ สมาชิกของชนิดแจกแจง หรือค่าคงที่ที่มีชื่อก็ได้ ระบบจะประเมินค่าจากบนลงล่าง ดังนั้นควรจัดแขนงที่เฉพาะเจาะจงที่สุดหรือพบบ่อยที่สุดไว้ก่อน
char grade = 'B';
string label = grade switch
{
'A' => "Excellent",
'B' => "Good",
'C' => "Fair",
_ => "Needs work"
};
System.Console.WriteLine(label);การคืนค่าจากเมธอด
นิพจน์สวิตช์เหมาะอย่างยิ่งสำหรับใช้ภายในเมธอด เนื่องจากโครงสร้างทั้งหมดเป็นนิพจน์ คุณจึงสามารถ return ค่าออกมาได้โดยตรง และมักเขียนเป็นเมธอดที่มีตัวนิพจน์อยู่ในบรรทัดเดียว
วิธีนี้ทำให้ตรรกะการแมปอ่านง่ายและรวมอยู่ในจุดเดียว แทนที่จะแยกสายโซ่ if/else if ไว้ทั่วทั้งตัวเมธอด
using System;
class Program {
static string Day(int d) => d switch {
0 => "Sun", 6 => "Sat", _ => "Weekday"
};
static void Main() => Console.WriteLine(Day(6));
}การเลือกตามชนิดแจกแจง
ชนิดแจกแจงทำงานร่วมกับนิพจน์สวิตช์ได้อย่างเป็นธรรมชาติ แต่ละแขนงระบุสมาชิกของชนิดแจกแจง และคอมไพเลอร์สามารถเตือนเมื่อมีกรณีขาดหาย หากคุณไม่ใส่แขนงละทิ้ง
ถึงอย่างนั้น การเก็บแขนง _ ไว้ก็ยังเป็นแนวทางที่ดี เพื่อไม่ให้ค่าใหม่ของชนิดแจกแจงในอนาคตทำให้แอปล้มเหลวขณะทำงาน
using System;
enum Light { Red, Yellow, Green }
class Program {
static void Main() {
Light l = Light.Green;
string action = l switch {
Light.Red => "Stop",
Light.Yellow => "Slow",
Light.Green => "Go",
_ => "?"
};
Console.WriteLine(action);
}
}เงื่อนไขดักด้วยเงื่อนไขเพิ่มเติม
เงื่อนไขดัก when จะเพิ่มเงื่อนไขบูลีนให้กับแขนง แขนงนั้นจะตรงกันก็ต่อเมื่อทั้งรูปแบบและเงื่อนไขดักเป็นจริง
วิธีนี้ช่วยให้คุณปรับความละเอียดของการตรวจสอบด้วยตรรกะใด ๆ ก็ได้ ซึ่งรูปแบบเพียงอย่างเดียวไม่สามารถแสดงออกมาได้ เช่น การตรวจสอบช่วงค่าร่วมกับตัวแปรอื่น
int temp = 30;
string weather = temp switch
{
int t when t < 0 => "Freezing",
int t when t < 20 => "Cool",
_ => "Warm"
};
System.Console.WriteLine(weather);ลำดับมีความสำคัญ
ระบบจะตรวจสอบแขนงตามลำดับที่เขียนไว้ในซอร์ส แขนงแรกที่ตรงกันจะเป็นผู้ชนะ ดังนั้นต้องวางรูปแบบที่เฉพาะเจาะจงกว่าไว้ก่อนรูปแบบที่ครอบคลุมกว้างกว่า
หากแขนงทั่วไปอยู่ก่อนแขนงเฉพาะเจาะจง คอมไพเลอร์จะแจ้งว่าแขนงหลังไม่มีทางทำงาน ควรอ่านแขนงจากบนลงล่างเหมือนกรวยที่เริ่มจากช่วงแคบแล้วขยายไปสู่ช่วงกว้าง
int score = 95;
string tier = score switch
{
>= 90 => "Gold",
>= 70 => "Silver",
_ => "Bronze"
};
System.Console.WriteLine(tier);ความครอบคลุมทุกกรณีและข้อยกเว้น
หากข้อมูลเข้าไม่ได้อยู่ในกรณีที่ครอบคลุมทั้งหมดและไม่มีแขนงใดตรงกัน ขณะทำงานจะโยน System.Runtime.CompilerServices.SwitchExpressionException
คอมไพเลอร์จะแสดงคำเตือน CS8509 เมื่อไม่สามารถพิสูจน์ได้ว่านิพจน์ครอบคลุมทุกกรณี ควรให้ความสำคัญกับคำเตือนนี้อย่างจริงจัง โดยเพิ่มแขนงละทิ้งหรือครอบคลุมค่าที่ขาดหาย เพื่อให้นิพจน์รองรับทุกกรณี
using System;
class Program {
static void Main() {
try {
int x = 5;
string s = x switch { 1 => "a", 2 => "b" };
Console.WriteLine(s);
} catch (Exception e) {
Console.WriteLine(e.GetType().Name);
}
}
}การรวมข้อมูลเข้าหลายค่า
หากต้องการเลือกตามค่ามากกว่าหนึ่งค่า ให้รวมค่าเหล่านั้นไว้ในทูเพิล จากนั้นแขนงจะตรวจสอบรูปแบบทูเพิล โดยเปรียบเทียบแต่ละตำแหน่ง
วิธีนี้เหมาะอย่างยิ่งกับเครื่องจักรสถานะหรือตารางการตัดสินใจที่ผลลัพธ์ขึ้นอยู่กับปัจจัยสองประการ เราจะศึกษาเรื่องรูปแบบทูเพิลโดยละเอียดในบทเรียนถัดไป
bool isWeekend = true; bool isRaining = false;
string plan = (isWeekend, isRaining) switch
{
(true, false) => "Go hiking",
(true, true) => "Watch a movie",
_ => "Work"
};
System.Console.WriteLine(plan);ตัวนิพจน์ที่อ่านง่าย
นิพจน์สวิตช์ทำงานร่วมกับ LINQ และสมาชิกที่มีตัวนิพจน์ได้ดี ทำให้สร้างสายงานประมวลผลที่กระชับ
เนื่องจากแขนงแต่ละแขนงคืนค่า คุณจึงใช้นิพจน์สวิตช์โดยตรงภายในการฉายผลของ Select หรือใช้เป็นอาร์กิวเมนต์ของเมธอดได้ โดยไม่ต้องสร้างตัวแปรชั่วคราว
using System;
using System.Linq;
class Program {
static void Main() {
var nums = new[] { 1, 2, 3 };
var labels = nums.Select(n => n switch {
1 => "one", 2 => "two", _ => "many"
});
Console.WriteLine(string.Join(",", labels));
}
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับนิพจน์สวิตช์
สรุปทบทวน
นิพจน์สวิตช์คืนค่าโดยใช้ input switch { pattern => result, ... } ซึ่งมีแขนงคั่นด้วยจุลภาค
ใช้ _ สำหรับค่าเริ่มต้น ใช้ when สำหรับเงื่อนไขดัก และจำไว้ว่าแขนงจะถูกตรวจสอบจากบนลงล่าง ควรทำให้ครอบคลุมทุกกรณีเพื่อหลีกเลี่ยงข้อยกเว้นขณะทำงาน บทถัดไปเราจะศึกษาเรื่องรูปแบบชนิดข้อมูลและรูปแบบคุณสมบัติ
คำถามที่พบบ่อย
บทเรียน “นิพจน์ switch” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นิพจน์ switch” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นิพจน์ switch”
switch ที่ส่งคืนค่าอย่างกระชับ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “นิพจน์ switch” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ