การใช้งาน switchboard

บ่อยครั้งที่คุณต้องทดสอบตัวแปรที่มีค่าเป็นไปได้หลายค่า เช่น maritalStatus อาจเป็น 0 สำหรับโสด, 1 สำหรับแต่งงานแล้ว, 2 สำหรับหย่าร้าง, 3 สำหรับหม้าย หรือ 4 สำหรับไม่สนใจ (หวังว่าจะครอบคลุมทุกตัวเลือกแล้ว) เพื่อแยกแยะระหว่างค่าเหล่านี้ คุณสามารถใช้ชุดคำสั่ง if ดังนี้:

if (maritalStatus == 0)
{
    // ต้องโสด ...
    // ... ทำบางอย่าง ...
}
else
{
    if (maritalStatus == 1)
    {
        // ต้องแต่งงานแล้ว ...
        // ... ทำบางอย่าง ...
    }
}

และอื่นๆ

คุณสามารถเห็นได้ว่าการใช้คำสั่ง if ที่ซ้ำๆ กันนี้จะน่าเบื่อมาก การทดสอบหลายค่าเป็นเหตุการณ์ที่เกิดขึ้นบ่อยครั้งจน C# ได้จัดเตรียมโครงสร้างพิเศษเพื่อการตัดสินใจระหว่างชุดของเงื่อนไขที่เกิดขึ้นเพียงครั้งเดียว คำสั่งนี้คือ switch ซึ่งทำงานดังนี้:

switch (maritalStatus)
{
    case 0:
        // ... ทำสิ่งที่เกี่ยวกับโสด ...
        break;

    case 1:
        // ... ทำสิ่งที่เกี่ยวกับแต่งงานแล้ว ...
        break;

    case 2:
        // ... ทำสิ่งที่เกี่ยวกับหย่าร้าง ...
        break;

    case 3:
        // ... ทำสิ่งที่เกี่ยวกับหม้าย ...
        break;

    case 4:
        // ... ออกจากหน้าฉันไป ...
        break;

    default:
        // เข้ามาที่นี่ถ้าไม่สามารถเข้ากรณีไหนได้;
        // นี่อาจจะเป็นสถานการณ์ผิดพลาด
        break;
}

นิพจน์ที่อยู่ด้านบนของคำสั่ง switch จะถูกประเมิน ในกรณีนี้ นิพจน์คือค่าของตัวแปร maritalStatus ค่าของนิพจน์นี้จะถูกเปรียบเทียบกับค่าของแต่ละกรณี การควบคุมจะผ่านไปยังคำสั่ง default หากไม่มีการจับคู่ใดๆ

การใช้คำสั่ง switch มีข้อจำกัดดังนี้:

  • อาร์กิวเมนต์ของ switch ต้องเป็นหนึ่งในชนิดที่สามารถนับได้ (รวมถึง char) หรือ string ไม่รวมค่าจุดลอย
  • ค่าในแต่ละ case ต้องเป็นค่าของชนิดเดียวกับนิพจน์ switch
  • ค่าใน case ต้องเป็นค่าคงที่ในลักษณะที่ค่าของมันต้องเป็นที่รู้ในช่วงเวลาแปลคำสั่ง (เช่น คำสั่ง case x จะไม่ถูกกฎหมายถ้า x ไม่ใช่ชนิดของค่าคงที่)
  • แต่ละ case ต้องจบด้วยคำสั่ง break (หรือคำสั่งออกอื่นๆ เช่น return) คำสั่ง break จะส่งผ่านการควบคุมออกจาก switch

คุณสามารถละเว้นคำสั่ง break ถ้าสองกรณีนำไปสู่การกระทำเดียวกัน: กรณีเดียวสามารถมีป้ายชื่อ case มากกว่าหนึ่ง เช่นในตัวอย่างนี้:

string s = "Davis";
switch(s)
{
    case "Davis":
    case "Rvidsten":
        // ทำสิ่งเดียวกันไม่ว่าจะเป็น Davis หรือ Rvidsten
        // เพราะพวกเขาเกี่ยวข้องกัน
        break;
    case "Smith":
        // ... ทำสิ่งที่เกี่ยวกับ Smith ...
        break;
    default:
        // มาที่นี่ถ้าไม่ตรงกับกรณีใด ๆ
        break;
}