0Pricing
C# Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. switch 表达式
  2. 类型与属性模式
  3. 关系模式与逻辑模式
  4. 列表与元组模式
← 返回 C# Academy