跳至页脚内容
Iron Academy Logo
学习 C#
学习 C#

其他类别

C# Switch Expression Explained:来自 Tim Corey 的实用指南

Tim Corey
9分16秒

在 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 on
if (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 项目中进行实验,看看你的逻辑可以变得多么简洁。

Hero Worlddot related to C# Switch Expression Explained:来自 Tim Corey 的实用指南
Hero Affiliate related to C# Switch Expression Explained:来自 Tim Corey 的实用指南

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我