首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# switch 陳述式進階:模式比對、範圍判斷與 Kim Larsen 公式實作

     編輯:關於C#

switch 演進歷程

版本特性範例
C# 1.0常數模式case 1: case 2:
C# 7.0型別模式、when 守衛case int n when n > 0:
C# 8.0switch 運算式、屬性/元組/位置模式return shape switch { Circle c => c.Radius, _ => 0 };
C# 9.0關係/邏輯/非模式case > 0: case <= 100 and >= 0:

Kim Larsen 公式計算星期幾


// 輸入:年(1-9999)、月(1-12)、日(1-31)
// 輸出:0=週日, 1=週一, ..., 6=週六
public static int DayOfWeek(int y, int m, int d) {
    if (m < 3) { m += 12; y--; }
    int week = (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
    return (week + 7) % 7; // 確保非負
}

// switch 表達式對應星期名稱 (C# 8+)
public static string WeekDayName(int y, int m, int d) => DayOfWeek(y, m, d) switch {
    0 => "星期日",
    1 => "星期一",
    2 => "星期二",
    3 => "星期三",
    4 => "星期四",
    5 => "星期五",
    6 => "星期六",
    _ => throw new ArgumentOutOfRangeException()
};

現代 switch 表達式完整語法


// 傳統陳述式
switch (value) {
    case 1: case 2: DoSomething(); break;
    case int n when n > 10: DoLarge(); break;
    default: DoDefault(); break;
}

// 運算式形式 (有回傳值)
var result = value switch {
    1 or 2 => "Small",
    int n when n > 10 => "Large",
    _ => "Other"
};

// 型別模式
object obj = "hello";
string desc = obj switch {
    int i => $"Integer: {i}",
    string s => $"String({s.Length}): {s}",
    null => "Null",
    _ => "Unknown"
};

// 元組模式
(string a, string b) = ("yes", "no");
var logic = (a, b) switch {
    ("yes", "yes") => "Both yes",
    ("yes", "no") => "First only",
    _ => "Other"
};

// 關係模式 (C# 9+)
int score = 85;
string grade = score switch {
    >= 90 => "A",
    >= 80 => "B",
    >= 70 => "C",
    >= 60 => "D",
    _ => "F"
};

// 非模式
string input = "test";
bool valid = input switch {
    not null and not "" => true,
    _ => false
};

效能與最佳實務

  • 編譯器優化:密集常數 case 產生跳躍表 (Jump Table) O(1)
  • 稀疏/字串 case 使用雜湊查找或二分搜尋
  • 避免在 case 區塊宣告變數 (作用域問題),改用區塊 { var x = ...; }
  • 複雜條件優先用 if-else 可讀性較佳
  • switch 運算式強制完整處理 (編譯器警告遺漏 case)

switch範例1
switch範例2
Kim Larsen公式

本文對應《叩響 C# 之門》第 4.4.2 節 switch 陳述式教學內容

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved