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

นิพจน์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. นิพจน์ switch
  2. รูปแบบชนิดข้อมูลและคุณสมบัติ
  3. รูปแบบเชิงสัมพันธ์และตรรกะ
  4. รูปแบบรายการและทูเพิล
← กลับไปที่ C# Academy