在 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# 中成为了一种强大且灵活的控制流工具。