switch语句 #

一、switch语句概述 #

switch语句根据表达式的值选择执行不同的代码分支,比多个if-else更清晰。

二、基本switch语句 #

2.1 基本语法 #

csharp
switch (expression)
{
    case value1:
        break;
    case value2:
        break;
    default:
        break;
}

2.2 简单示例 #

csharp
int day = 3;
string dayName;

switch (day)
{
    case 1:
        dayName = "星期一";
        break;
    case 2:
        dayName = "星期二";
        break;
    case 3:
        dayName = "星期三";
        break;
    case 4:
        dayName = "星期四";
        break;
    case 5:
        dayName = "星期五";
        break;
    case 6:
        dayName = "星期六";
        break;
    case 7:
        dayName = "星期日";
        break;
    default:
        dayName = "无效日期";
        break;
}

Console.WriteLine(dayName);

2.3 多个case共享代码 #

csharp
int month = 2;
int days;

switch (month)
{
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days = 30;
        break;
    case 2:
        days = 28;
        break;
    default:
        days = 0;
        break;
}

三、switch表达式(C# 8+) #

3.1 基本语法 #

csharp
result = expression switch
{
    pattern1 => value1,
    pattern2 => value2,
    _ => defaultValue
};

3.2 使用示例 #

csharp
int day = 3;
string dayName = day switch
{
    1 => "星期一",
    2 => "星期二",
    3 => "星期三",
    4 => "星期四",
    5 => "星期五",
    6 => "星期六",
    7 => "星期日",
    _ => "无效日期"
};

3.3 返回方法调用 #

csharp
string result = operation switch
{
    "add" => Add(a, b),
    "subtract" => Subtract(a, b),
    "multiply" => Multiply(a, b),
    "divide" => Divide(a, b),
    _ => throw new InvalidOperationException()
};

四、模式匹配 #

4.1 类型模式 #

csharp
object obj = "Hello";

switch (obj)
{
    case int n:
        Console.WriteLine($"整数:{n}");
        break;
    case string s:
        Console.WriteLine($"字符串:{s}");
        break;
    case double d:
        Console.WriteLine($"浮点数:{d}");
        break;
    case null:
        Console.WriteLine("null");
        break;
    default:
        Console.WriteLine("其他类型");
        break;
}

4.2 关系模式 #

csharp
int score = 85;
string grade = score switch
{
    >= 90 => "优秀",
    >= 80 => "良好",
    >= 70 => "中等",
    >= 60 => "及格",
    < 60 => "不及格"
};

4.3 逻辑模式 #

csharp
int number = 42;
string category = number switch
{
    < 0 => "负数",
    0 => "零",
    > 0 and < 10 => "个位数正数",
    >= 10 and < 100 => "两位数正数",
    >= 100 => "三位数及以上正数"
};

4.4 属性模式 #

csharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Role { get; set; }
}

var person = new Person { Name = "张三", Age = 25, Role = "Admin" };

string access = person switch
{
    { Role: "Admin" } => "完全访问权限",
    { Role: "Manager", Age: >= 30 } => "管理权限",
    { Role: "User", Age: >= 18 } => "普通权限",
    { Age: < 18 } => "受限权限",
    _ => "无权限"
};

4.5 列表模式(C# 11+) #

csharp
int[] numbers = { 1, 2, 3 };

string result = numbers switch
{
    [] => "空数组",
    [var single] => $"单个元素:{single}",
    [var first, var second] => $"两个元素:{first}, {second}",
    [var first, .., var last] => $"首尾元素:{first}, {last}",
    _ => "其他情况"
};

五、when条件 #

5.1 基本用法 #

csharp
int number = 15;

switch (number)
{
    case int n when n % 15 == 0:
        Console.WriteLine("FizzBuzz");
        break;
    case int n when n % 3 == 0:
        Console.WriteLine("Fizz");
        break;
    case int n when n % 5 == 0:
        Console.WriteLine("Buzz");
        break;
    default:
        Console.WriteLine(number);
        break;
}

5.2 复杂条件 #

csharp
var order = new { Amount = 1000, Customer = "VIP", Items = 5 };

decimal discount = order switch
{
    { Amount: > 5000 } => 0.20m,
    { Amount: > 2000, Customer: "VIP" } => 0.15m,
    { Amount: > 1000, Items: > 3 } => 0.10m,
    { Customer: "VIP" } => 0.05m,
    _ => 0m
};

六、元组模式 #

6.1 基本用法 #

csharp
(string operation, int a, int b) = ("add", 10, 5);

int result = (operation, a, b) switch
{
    ("add", var x, var y) => x + y,
    ("subtract", var x, var y) => x - y,
    ("multiply", var x, var y) => x * y,
    ("divide", var x, var y) when y != 0 => x / y,
    _ => throw new InvalidOperationException()
};

6.2 游戏状态示例 #

csharp
enum Move { Rock, Paper, Scissors }

string GetResult(Move player1, Move player2) => (player1, player2) switch
{
    (Move.Rock, Move.Scissors) => "玩家1获胜",
    (Move.Scissors, Move.Paper) => "玩家1获胜",
    (Move.Paper, Move.Rock) => "玩家1获胜",
    (Move.Scissors, Move.Rock) => "玩家2获胜",
    (Move.Paper, Move.Scissors) => "玩家2获胜",
    (Move.Rock, Move.Paper) => "玩家2获胜",
    _ => "平局"
};

七、实战示例 #

7.1 计算器 #

csharp
public static double Calculate(double a, double b, string op) => op switch
{
    "+" => a + b,
    "-" => a - b,
    "*" => a * b,
    "/" => b != 0 ? a / b : throw new DivideByZeroException(),
    "%" => a % b,
    "^" => Math.Pow(a, b),
    _ => throw new ArgumentException($"未知运算符:{op}")
};

7.2 HTTP状态码处理 #

csharp
public static string GetStatusMessage(int statusCode) => statusCode switch
{
    200 => "OK",
    201 => "Created",
    204 => "No Content",
    400 => "Bad Request",
    401 => "Unauthorized",
    403 => "Forbidden",
    404 => "Not Found",
    500 => "Internal Server Error",
    >= 200 and < 300 => "Success",
    >= 300 and < 400 => "Redirect",
    >= 400 and < 500 => "Client Error",
    >= 500 => "Server Error",
    _ => "Unknown Status"
};

7.3 季节判断 #

csharp
public static string GetSeason(int month) => month switch
{
    3 or 4 or 5 => "春季",
    6 or 7 or 8 => "夏季",
    9 or 10 or 11 => "秋季",
    12 or 1 or 2 => "冬季",
    _ => throw new ArgumentException("无效月份")
};

7.4 对象类型处理 #

csharp
public static string Describe(object obj) => obj switch
{
    null => "null值",
    int n when n < 0 => $"负整数:{n}",
    int n => $"正整数:{n}",
    double d => $"浮点数:{d:F2}",
    string s when s.Length > 10 => $"长字符串({s.Length}字符)",
    string s => $"字符串:{s}",
    List<int> list => $"整数列表,{list.Count}个元素",
    DateTime dt => $"日期时间:{dt:yyyy-MM-dd HH:mm:ss}",
    _ => $"未知类型:{obj.GetType().Name}"
};

八、switch vs if-else #

8.1 使用switch的场景 #

  • 多个离散值比较
  • 枚举类型判断
  • 模式匹配
  • 代码可读性要求高

8.2 使用if-else的场景 #

  • 复杂条件表达式
  • 范围判断
  • 布尔条件
  • 条件之间有依赖关系

九、最佳实践 #

9.1 总是包含default #

csharp
switch (value)
{
    case 1:
        break;
    default:
        break;
}

9.2 使用switch表达式简化 #

csharp
string GetDayName(int day) => day switch
{
    1 => "星期一",
    2 => "星期二",
    3 => "星期三",
    4 => "星期四",
    5 => "星期五",
    6 => "星期六",
    7 => "星期日",
    _ => throw new ArgumentOutOfRangeException()
};

9.3 避免穿透 #

csharp
switch (value)
{
    case 1:
        DoSomething();
        break;
    case 2:
        DoSomething();
        break;
}

十、总结 #

switch语句要点:

特性 说明
传统switch case + break
switch表达式 pattern => value
模式匹配 类型、关系、属性模式
when条件 附加条件判断

下一步,让我们学习循环语句!

最后更新:2026-03-26