Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
9分16秒
在 C# 开发领域,编写简洁易维护的代码是一项关键目标。现代 C# 的一个特性——switch 表达式——有助于实现这一目标,它是传统 switch 语句的一种简洁而强大的替代方案。 虽然经常被忽视,但 switch 表达式简化了复杂的逻辑分支,尤其是在处理关系模式、模式匹配和常量模式时。
为了更好地了解此功能的工作原理以及它与传统方法的比较,我们将观看 Tim Corey 制作的一段很有帮助的视频。 在 Tim 的" C# 中的 switch 表达式"视频中,他详细讲解了 C# 中 switch 表达式的实际用法,演示了如何用更少的代码行编写更好的代码。
让我们深入了解 Tim 的实际解释,他从一个评分示例开始,逐步深入到使用接口、类型模式和对象评估的更高级场景。
Tim 首先创建了一个控制台应用程序,其中一个名为 numberGrade 的 int 变量存储着一个测试分数,例如 85。目标是将此数值输入值转换为相应的字母等级,例如"B"。 大多数情况下,开发人员会使用一系列 if-else 语句或 switch 语句,如下所示:
if (numberGrade >= 90)
letterGrade = "A";
else if (numberGrade >= 80)
letterGrade = "B";
// ...and so onIf numberGrade >= 90 Then
letterGrade = "A"
ElseIf numberGrade >= 80 Then
letterGrade = "B"
' ...and so on
End If虽然这种方法可行,但过于冗长。 另一方面,C# switch 表达式提供了更简洁的语法。
为了演示 switch 表达式,Tim 使用以下代码重写了上述逻辑:
string letterGrade = numberGrade switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};Dim letterGrade As String =
If(numberGrade >= 90, "A",
If(numberGrade >= 80, "B",
If(numberGrade >= 70, "C",
If(numberGrade >= 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
End Interface
Record Dog(Name As String)
Implements IAnimal
End Record
Record Cat(Title As String, Name As String)
Implements IAnimal
End Record
Record Cow(Breed As String)
Implements IAnimal
End Record他用各种动物实例填充了一个列表,并演示了如何使用类型模式匹配来识别对象类型并提取数据。
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 TypeOf a Is Dog Then
Dim d As Dog = DirectCast(a, Dog)
message = $"Dog: {d.Name}"
ElseIf TypeOf a Is Cat Then
Dim c As Cat = DirectCast(a, Cat)
message = $"Cat: {c.Title} {c.Name}"
ElseIf TypeOf a Is Cow Then
Dim co As Cow = DirectCast(a, Cow)
message = $"Cow: {co.Breed}"
Else
message = "Unknown animal"
End If可以用更简洁易读的 switch 表达式代替:
string message = a switch
{
Dog d => $"Dog: {d.Name}",
Cat c => $"Cat: {c.Title} {c.Name}",
Cow co => $"Cow: {co.Breed}",
_ => "Unknown animal"
};Dim message As String =
If(TypeOf a Is Dog, $"Dog: {DirectCast(a, Dog).Name}",
If(TypeOf a Is Cat, $"Cat: {DirectCast(a, Cat).Title} {DirectCast(a, Cat).Name}",
If(TypeOf a Is Cow, $"Cow: {DirectCast(a, Cow).Breed}",
"Unknown animal")))该表达式检查对象的类型,并根据匹配的模式应用正确的输出。 如果没有找到匹配项,则使用 discard _ 回退到默认结果。
此功能增强了功能性,同时又不牺牲清晰度。 运行时行为仍然可预测且易于理解。
虽然 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"
};Dim score As Integer = 90
Dim result As String = score Select Case
Case s When s >= 90 AndAlso s <= 100
Return "Excellent"
Case s When s >= 75
Return "Good"
Case Else
Return "Needs Improvement"
End Select在这里,when 子句允许使用更复杂的布尔表达式对参数进行自定义评估。
Tim 强调了一个关键概念:虽然 switch 表达式可以让你的代码更简洁,但简洁并不总是意味着更好。 有时,尤其是在逻辑复杂或输入不明确的情况下,传统的 switch 语句或 if 代码块可能更合适。
你不必在所有情况下都使用 switch 表达式——选择合适的工具来完成工作。 这并不是要加入"换装邪教",就像蒂姆开玩笑说的那样。 关键在于编写易于维护和理解的系统代码。
C# switch 表达式提供了一种现代、简洁的方式,可以根据输入模式评估和返回值,它结合了常量、关系和类型模式。 当您想要简化逻辑、减少样板代码并提高可读性时,它们是理想之选。
从整数评分到识别动物物体,蒂姆·科里 (Tim Corey) 的视频中的以下示例突出了它们的实际用途。 无论您是构建用于计算结果的函数、处理用户输入,还是处理空值和未定义的情况,switch 表达式都可以帮助您节省时间、减少错误,并使您的代码库更易于管理。
正如 Tim 所说,"它们是工具箱中非常有用的工具,可以让你的代码更简单、更清晰,而且仍然易于理解,甚至更易于理解。"
如果您希望提高 C# 代码质量并跟上 .NET Core 的创新步伐,请不要忽略 switch 表达式。 不妨尝试一下,在你的 Visual Studio 项目中进行实验,看看你的逻辑可以变得多么简洁。
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy