C# Academy · 课时

switch 表达式与使用 when 的穷尽性检查(C# 6 模拟)

使用传统的 switch-return 方法模拟 switch 表达式,添加保护性检查,并使用 default 抛出异常,以便在运行时捕获未处理的情况。

第 2 / 3 课8 个步骤

switch 表达式与使用 when 的穷尽性检查(C# 6 模拟) 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 3 节课。

计划:模拟 switch

目标:在 C# 6 中模拟现代 switch 表达式。

  • 从经典 switch返回值
  • 预先使用守卫检查
  • 通过default throw快速失败,以确保覆盖所有情况

返回值的 switch

一个会返回值的开关,其作用类似于开关表达式。默认抛出异常会捕获未知值。

using System;

public enum Grade { A, B, C, D, F }

public class Program
{
  static string Describe(Grade g)
  {
    switch (g)
    {
      case Grade.A: return "Excellent";
      case Grade.B: return "Good";
      case Grade.C: return "Average";
      case Grade.D: return "Below average";
      case Grade.F: return "Fail";
      default: throw new ArgumentOutOfRangeException("g");
    }
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(Describe(Grade.A));
    Console.WriteLine(Describe(Grade.F));
  }
}

通过保护条件实现条件匹配

使用保护性检查(条件判断)来模拟条件子句。请先验证输入,再按范围进行分支。

using System;

public class Program
{
  // Emulate: switch(score) { case var s when s >= 90: ... } using pre-guards
  static string LabelScore(int score)
  {
    if (score < 0 || score > 100) throw new ArgumentOutOfRangeException("score");

    if (score >= 90) return "A";
    if (score >= 80) return "B";
    if (score >= 70) return "C";
    if (score >= 60) return "D";
    return "F";
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(LabelScore(92)); // A
    Console.WriteLine(LabelScore(77)); // C
  }
}

Exhaustive 辅助方法

添加一个小型的Exhaustive.Unhandled辅助方法,并在默认分支中调用它。当新增枚举值未被处理时,测试会失败。

using System;

public enum Status { New, Active, Closed }

public static class Exhaustive
{
  public static Exception Unhandled(object x)
  {
    return new InvalidOperationException("Unhandled case: " + x);
  }
}

public class Program
{
  static int ToHttp(Status s)
  {
    switch (s)
    {
      case Status.New: return 201;
      case Status.Active: return 200;
      case Status.Closed: return 410;
      default: throw Exhaustive.Unhandled(s);
    }
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(ToHttp(Status.Active)); // 200
  }
}

保护条件 + 按类型切换

先通过前置保护检查验证每个分支的数据,再根据判别字段进行切换。这与各个分支上的条件匹配相对应。

using System;

public enum ShapeKind { Circle, Square }

public sealed class Shape
{
  public ShapeKind Kind;
  public double Radius; // for circle
  public double Side;   // for square
}

public class Program
{
  static double Area(Shape s)
  {
    if (s == null) throw new ArgumentNullException("s");

    // “when” guards (validate needed fields)
    if (s.Kind == ShapeKind.Circle && s.Radius < 0) throw new ArgumentException("Radius must be >= 0");
    if (s.Kind == ShapeKind.Square && s.Side < 0) throw new ArgumentException("Side must be >= 0");

    switch (s.Kind)
    {
      case ShapeKind.Circle: return Math.PI * s.Radius * s.Radius;
      case ShapeKind.Square: return s.Side * s.Side;
      default: throw new InvalidOperationException("Unhandled shape: " + s.Kind);
    }
  }

  public static void Main(string[] args)
  {
    Shape c = new Shape { Kind = ShapeKind.Circle, Radius = 2.0 };
    Console.WriteLine("Area circle = " + Area(c));
  }
}

提示与易错点

提示:

  • 优先使用小型的返回值方法(单一职责)
  • 保留默认分支抛出异常,以便尽早暴露遗漏的分支
  • 将保护条件放在开关之前;它们的作用类似于条件匹配

完备性模拟

快速检查:在 C# 6 中,如何模拟类似于带条件匹配的开关表达式的完备开关处理?

回顾

回顾:像开关表达式一样从经典开关返回值,用保护条件添加条件匹配,并保留默认抛出异常来暴露遗漏的分支。

免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「switch 表达式与使用 when 的穷尽性检查(C# 6 模拟)」课时是免费的吗?

是的 — 「switch 表达式与使用 when 的穷尽性检查(C# 6 模拟)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 3 节课。

「switch 表达式与使用 when 的穷尽性检查(C# 6 模拟)」这节课中我会学到什么?

使用传统的 switch-return 方法模拟 switch 表达式,添加保护性检查,并使用 default 抛出异常,以便在运行时捕获未处理的情况。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「switch 表达式与使用 when 的穷尽性检查(C# 6 模拟)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. is 模式、关系模式与逻辑模式(C# 6 模拟)
  2. switch 表达式与使用 when 的穷尽性检查(C# 6 模拟)
  3. 使用判别联合(记录)进行领域建模——C# 6 模拟
← 返回 C# Academy