在 C# 中,switch 语句用于基于表达式的值执行不同的代码块。switch 语句类似于一系列 if-else 语句,但通常更简洁、易读。以下是 switch 语句的基本用法和一些高级特性。
基本用法
csharp复制代码
|---|--------------------------------------|
| | using System; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | int day = 3; |
| | |
| | switch (day) |
| | { |
| | case 1: |
| | Console.WriteLine("Monday"); |
| | break; |
| | case 2: |
| | Console.WriteLine("Tuesday"); |
| | break; |
| | case 3: |
| | Console.WriteLine("Wednesday"); |
| | break; |
| | case 4: |
| | Console.WriteLine("Thursday"); |
| | break; |
| | case 5: |
| | Console.WriteLine("Friday"); |
| | break; |
| | case 6: |
| | Console.WriteLine("Saturday"); |
| | break; |
| | case 7: |
| | Console.WriteLine("Sunday"); |
| | break; |
| | default: |
| | Console.WriteLine("Invalid day"); |
| | break; |
| | } |
| | } |
| | } |
特性说明
case标签 :每个case标签对应一个要匹配的值。break语句 :如果匹配成功,执行相应的代码块。break语句防止执行流进入下一个case块(即防止"贯穿"现象)。default标签 :如果表达式的值不匹配任何case标签,则执行default块的代码。default标签是可选的。
高级用法
1. switch 表达式(C# 8.0 及以上)
从 C# 8.0 开始,switch 语句也可以用作表达式,返回一个值。
csharp复制代码
|---|--------------------------------|
| | using System; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | int day = 3; |
| | string dayName = day switch |
| | { |
| | 1 => "Monday", |
| | 2 => "Tuesday", |
| | 3 => "Wednesday", |
| | 4 => "Thursday", |
| | 5 => "Friday", |
| | 6 => "Saturday", |
| | 7 => "Sunday", |
| | _ => "Invalid day" |
| | }; |
| | |
| | Console.WriteLine(dayName); |
| | } |
| | } |
2. 模式匹配(C# 7.0 及以上)
C# 7.0 引入了模式匹配,可以在 switch 语句中使用 when 子句进行更复杂的条件判断。
csharp复制代码
|---|---------------------------------------------|
| | using System; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | object obj = "Hello"; |
| | |
| | switch (obj) |
| | { |
| | case int i: |
| | Console.WriteLine($"Integer: {i}"); |
| | break; |
| | case string s when s.Length > 5: |
| | Console.WriteLine($"Long string: {s}"); |
| | break; |
| | case string s: |
| | Console.WriteLine($"Short string: {s}"); |
| | break; |
| | default: |
| | Console.WriteLine("Unknown type"); |
| | break; |
| | } |
| | } |
| | } |
3. 多个 case 标签合并
从 C# 7.0 开始,你可以合并多个 case 标签。
csharp复制代码
|---|--------------------------------------|
| | using System; |
| | |
| | class Program |
| | { |
| | static void Main() |
| | { |
| | int day = 6; |
| | |
| | switch (day) |
| | { |
| | case 6: |
| | case 7: |
| | Console.WriteLine("Weekend"); |
| | break; |
| | case 1: |
| | case 2: |
| | case 3: |
| | case 4: |
| | case 5: |
| | Console.WriteLine("Weekday"); |
| | break; |
| | default: |
| | Console.WriteLine("Invalid day"); |
| | break; |
| | } |
| | } |
| | } |
注意事项
switch语句中的表达式必须是可比较的(如int、string、Enum等)。- 每个
case块通常应以break语句结束,以避免执行流进入下一个case块。 default块是可选的,但如果表达式不匹配任何case标签且没有default块,则不执行任何操作。
通过这些用法和特性,switch 语句在 C# 中成为了一种强大且灵活的控制流工具。