switch 表达式
简洁的返回值 switch。
switch 表达式 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
什么是切换表达式
切换表达式 会将输入依次与一系列模式进行匹配,并返回一个值。与传统的切换语句不同,它是一个表达式,因此会产生可以赋值或返回的结果。
它会在值后使用 switch 关键字,并将各个分支写成 pattern => result 的形式。这样可以让分支逻辑更加紧凑且符合函数式风格。
int code = 2;
string name = code switch
{
1 => "One",
2 => "Two",
_ => "Other"
};
System.Console.WriteLine(name);语句与表达式
旧式切换语句使用 case labels 和 break。较新的切换表达式则完全省略了这些关键字。
各个分支之间用逗号分隔,整个表达式以分号结尾,并且每个分支都会产生一个值,而不是执行会继续贯穿的代码块。这样可以消除一整类因忘记 break 而导致的错误。
// Statement style
switch (code) { case 1: result = "One"; break; }
// Expression style
result = code switch { 1 => "One", _ => "?" };丢弃分支
下划线 _ 是丢弃模式。它可以匹配任何内容,并充当默认分支。
切换表达式必须是完备的:如果运行时没有任何分支匹配,就会抛出 SwitchExpressionException。添加 _ 分支可以确保匹配所有可能的输入。
using System;
class Program {
static void Main() {
int n = 7;
string size = n switch {
< 5 => "small",
_ => "big"
};
Console.WriteLine(size);
}
}常量模式
最简单的分支使用常量模式:输入会使用相等性与一个字面值进行比较。
常量可以是数字、字符串、字符、枚举成员或命名常量。它们会从上到下进行求值,因此请按从最具体或最常见的分支开始的顺序进行 order。
char grade = 'B';
string label = grade switch
{
'A' => "Excellent",
'B' => "Good",
'C' => "Fair",
_ => "Needs work"
};
System.Console.WriteLine(label);从方法返回
切换表达式在方法中尤其有用。由于整个结构本身就是一个表达式,您可以直接 return 它,通常还能将方法写成单行的表达式主体形式。
这样可以让映射逻辑保持清晰并集中管理,而不是将 if/else if 链分散在方法体中。
using System;
class Program {
static string Day(int d) => d switch {
0 => "Sun", 6 => "Sat", _ => "Weekday"
};
static void Main() => Console.WriteLine(Day(6));
}对枚举进行切换
枚举与切换表达式非常契合。每个分支都会指定一个枚举成员;如果省略丢弃分支,编译器可以在缺少某个分支时发出警告。
不过,保留 _ 分支仍然是明智的做法,这样未来新增的枚举值就不会在运行时导致应用崩溃。
using System;
enum Light { Red, Yellow, Green }
class Program {
static void Main() {
Light l = Light.Green;
string action = l switch {
Light.Red => "Stop",
Light.Yellow => "Slow",
Light.Green => "Go",
_ => "?"
};
Console.WriteLine(action);
}
}使用条件保护子句
when 保护可以为分支添加布尔条件。只有模式和保护条件都为 true 时,该分支才会匹配。
这样可以使用模式本身无法表达的任意逻辑来细化匹配,例如将范围检查与其他变量结合起来。
int temp = 30;
string weather = temp switch
{
int t when t < 0 => "Freezing",
int t when t < 20 => "Cool",
_ => "Warm"
};
System.Console.WriteLine(weather);Order 很重要
分支会按照源代码中的顺序进行测试。第一个匹配的分支会获胜,因此更具体的模式必须放在更宽泛的模式之前。
如果通用分支位于具体分支之前,编译器会将后一个分支报告为不可达。请像从窄到宽的漏斗一样,从上到下阅读各个分支。
int score = 95;
string tier = score switch
{
>= 90 => "Gold",
>= 70 => "Silver",
_ => "Bronze"
};
System.Console.WriteLine(tier);完备性与异常
如果没有覆盖所有输入,并且没有任何分支匹配,运行时就会抛出 System.Runtime.CompilerServices.SwitchExpressionException。
当编译器无法证明表达式是完备的时,会发出警告 CS8509。请认真处理此警告:添加丢弃分支,或覆盖缺失的值,从而确保表达式对所有情况都有定义。
using System;
class Program {
static void Main() {
try {
int x = 5;
string s = x switch { 1 => "a", 2 => "b" };
Console.WriteLine(s);
} catch (Exception e) {
Console.WriteLine(e.GetType().Name);
}
}
}组合多个输入
如果要根据多个值进行切换,可以将它们封装在元组中。此时各个分支会匹配元组模式,并比较每个位置的值。
这非常适合状态机或决策表,尤其是结果取决于一对因素的情况。我们会在后续课程中深入探讨元组模式。
bool isWeekend = true; bool isRaining = false;
string plan = (isWeekend, isRaining) switch
{
(true, false) => "Go hiking",
(true, true) => "Watch a movie",
_ => "Work"
};
System.Console.WriteLine(plan);可读的表达式主体
切换表达式可以很好地与 LINQ 和表达式主体成员组合,生成简洁的处理流程。
由于每个分支都会返回一个值,因此您可以直接在 Select 投影中使用切换表达式,或将其作为方法参数,从而避免创建临时变量。
using System;
using System.Linq;
class Program {
static void Main() {
var nums = new[] { 1, 2, 3 };
var labels = nums.Select(n => n switch {
1 => "one", 2 => "two", _ => "many"
});
Console.WriteLine(string.Join(",", labels));
}
}快速检查
测试您对切换表达式的理解。
回顾
切换表达式使用 input switch { pattern => result, ... } 和逗号分隔的分支来返回一个值。
使用 _ 表示默认分支,使用 when 添加保护条件,并记住分支会从上到下进行测试。请确保分支是完备的,以避免运行时异常。下一步我们将探讨类型模式和属性模式。
常见问题解答
「switch 表达式」课时是免费的吗?
是的 — 「switch 表达式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「switch 表达式」这节课中我会学到什么?
简洁的返回值 switch。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「switch 表达式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。