C# Switch Expression Explained:来自 Tim Corey 的实用指南
在 C# 开发领域,编写简洁易维护的代码是一项关键目标。现代 C# 的一个特性——switch 表达式——有助于实现这一目标,它是传统 switch 语句的一种简洁而强大的替代方案。 虽然经常被忽视,但 switch 表达式简化了复杂的逻辑分支,尤其是在处理关系模式、模式匹配和常量模式时。
为了更好地了解此功能的工作原理以及它与传统方法的比较,我们将观看 Tim Corey 制作的一段很有帮助的视频。 在 Tim 的" C# 中的 switch 表达式"视频中,他详细讲解了 C# 中 switch 表达式的实际用法,演示了如何用更少的代码行编写更好的代码。
让我们深入了解 Tim 的实际解释,他从一个评分示例开始,逐步深入到使用接口、类型模式和对象评估的更高级场景。
传统 If-Else 表达式与 Switch 表达式
Tim 首先创建了一个控制台应用程序,其中一个名为 numberGrade 的 int 变量存储着一个测试分数,例如 85。目标是将此数值输入值转换为相应的字母等级,例如"B"。 大多数情况下,开发人员会使用一系列 if-else 语句或 switch 语句,如下所示:
if (numberGrade >= 90)
letterGrade = "A";
else if (numberGrade >= 80)
letterGrade = "B";
// ...and so onif (numberGrade >= 90)
letterGrade = "A";
else if (numberGrade >= 80)
letterGrade = "B";
// ...and so on虽然这种方法可行,但过于冗长。 另一方面,C# switch 表达式提供了更简洁的语法。
编写用于评分的 Switch 表达式
为了演示 switch 表达式,Tim 使用以下代码重写了上述逻辑:
string letterGrade = numberGrade switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};string letterGrade = numberGrade switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};在这里,switch 关键字被用在了一个新的上下文中——作为表达式,而不是语句。 这意味着它可以直接计算出一个值,并且可以赋值给一个变量(例如 letterGrade)。
此形式支持关系模式(例如,>= 90),并使用丢弃模式(_)来处理默认情况,这等同于最后的 else。
Tim 指出,编译器在运行时确定匹配项,自顶向下检查每个条件,并选择第一个符合输入的模式。
利用表达式简化代码
用蒂姆的话来说,这种新语法"取代了大量代码"。它不再像以前那样用 else if 重复条件判断,而是用 switch 表达式以清晰简洁的结构处理所有事情。 这简化了控制流程,提高了可读性,并减少了逻辑中的冗余。
他强调,这种结构在将输入值映射到特定输出(如评分、状态消息或数据转换)时特别有用。
将模式匹配与对象类型结合使用
为了探索类型模式和模式匹配,Tim 引入了一个涉及 IAnimal 接口的场景。 他定义了三个类——狗、猫和牛——每个类都实现了该接口。 这使他能够创建一个动物列表,每个动物都有不同的特性。
interface IAnimal { }
record Dog(string Name) : IAnimal;
record Cat(string Title, string Name) : IAnimal;
record Cow(string Breed) : IAnimal;interface IAnimal { }
record Dog(string Name) : IAnimal;
record Cat(string Title, string Name) : IAnimal;
record Cow(string Breed) : IAnimal;他用各种动物实例填充了一个列表,并演示了如何使用类型模式匹配来识别对象类型并提取数据。
带模式匹配的切换表达式
Tim 展示了如何使用 if 语句来实现以下代码:
if (a is Dog d)
message = $"Dog: {d.Name}";
else if (a is Cat c)
message = $"Cat: {c.Title} {c.Name}";
else if (a is Cow co)
message = $"Cow: {co.Breed}";
else
message = "Unknown animal";if (a is Dog d)
message = $"Dog: {d.Name}";
else if (a is Cat c)
message = $"Cat: {c.Title} {c.Name}";
else if (a is Cow co)
message = $"Cow: {co.Breed}";
else
message = "Unknown animal";可以用更简洁易读的 switch 表达式代替:
string message = a switch
{
Dog d => $"Dog: {d.Name}",
Cat c => $"Cat: {c.Title} {c.Name}",
Cow co => $"Cow: {co.Breed}",
_ => "Unknown animal"
};string message = a switch
{
Dog d => $"Dog: {d.Name}",
Cat c => $"Cat: {c.Title} {c.Name}",
Cow co => $"Cow: {co.Breed}",
_ => "Unknown animal"
};该表达式检查对象的类型,并根据匹配的模式应用正确的输出。 如果没有找到匹配项,则使用 discard _ 回退到默认结果。
此功能增强了功能性,同时又不牺牲清晰度。 运行时行为仍然可预测且易于理解。
使用 when 关键字的可选守卫
虽然 Tim 的示例中没有演示,但需要注意的是,switch 表达式可以使用 when 关键字进行扩展,以应用可选的布尔条件:
int score = 90;
string result = score switch
{
int s when s >= 90 && s <= 100 => "Excellent",
int s when s >= 75 => "Good",
_ => "Needs Improvement"
};int score = 90;
string result = score switch
{
int s when s >= 90 && s <= 100 => "Excellent",
int s when s >= 75 => "Good",
_ => "Needs Improvement"
};在这里,when 子句允许使用更复杂的布尔表达式对参数进行自定义评估。
最佳实践和结语
Tim 强调了一个关键概念:虽然 switch 表达式可以让你的代码更简洁,但简洁并不总是意味着更好。 有时,尤其是在逻辑复杂或输入不明确的情况下,传统的 switch 语句或 if 代码块可能更合适。
你不必在所有情况下都使用 switch 表达式——选择合适的工具来完成工作。 这并不是要加入"换装邪教",就像蒂姆开玩笑说的那样。 关键在于编写易于维护和理解的系统代码。
摘要:向开发工具箱添加 Switch 表达式
C# switch 表达式提供了一种现代、简洁的方式,可以根据输入模式评估和返回值,它结合了常量、关系和类型模式。 当您想要简化逻辑、减少样板代码并提高可读性时,它们是理想之选。
从整数评分到识别动物物体,蒂姆·科里 (Tim Corey) 的视频中的以下示例突出了它们的实际用途。 无论您是构建用于计算结果的函数、处理用户输入,还是处理空值和未定义的情况,switch 表达式都可以帮助您节省时间、减少错误,并使您的代码库更易于管理。
正如 Tim 所说,"它们是工具箱中非常有用的工具,可以让你的代码更简单、更清晰,而且仍然易于理解,甚至更易于理解。"
如果您希望提高 C# 代码质量并跟上 .NET Core 的创新步伐,请不要忽略 switch 表达式。 不妨尝试一下,在你的 Visual Studio 项目中进行实验,看看你的逻辑可以变得多么简洁。

