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