0Pricing
C# Academy · Урок

Выражения switch и исчерпывающие проверки с when (эмуляция в C# 6)

Эмулируйте выражения switch с классическими методами switch и return, добавляйте защитные проверки и используйте выброс исключения по умолчанию для обнаружения необработанных случаев во время выполнения.

«Выражения switch и исчерпывающие проверки с when (эмуляция в C# 6)» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

План: имитация switch

Цель: имитировать современные выражения switch в C# 6.

  • Возвращайте значения из классического switch
  • Предварительно проверяйте условия с помощью защитных проверок
  • Быстро завершайте выполнение через выбрасывание исключения в default, обеспечивая полноту обработки

Возврат значения из 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));
  }
}

Условия через защитные проверки

Используйте защитные проверки (условия if), чтобы имитировать условные ветви. Сначала проверяйте входные данные, затем выбирайте ветвь по диапазонам.

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 можно имитировать полную обработку вариантов в операторе выбора, подобную выражению выбора с условными ветвями?

Повторение

Повторение: возвращайте значение из классического оператора выбора, добавляйте защитные проверки для условных ветвей и оставляйте ветвь по умолчанию с исключением, чтобы обнаруживать пропущенные варианты.

Часто задаваемые вопросы

Урок «Выражения switch и исчерпывающие проверки с when (эмуляция в C# 6)» бесплатный?

Да — полный текст урока «Выражения switch и исчерпывающие проверки с when (эмуляция в C# 6)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Выражения switch и исчерпывающие проверки с when (эмуляция в C# 6)»?

Эмулируйте выражения switch с классическими методами switch и return, добавляйте защитные проверки и используйте выброс исключения по умолчанию для обнаружения необработанных случаев во время выполне… Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 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