Выражения 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));
}
}
Советы и подводные камни
Советы:
- Предпочитайте небольшие методы, возвращающие значение (с одной зоной ответственности)
- Оставляйте ветвь по умолчанию с исключением, чтобы сразу обнаруживать пропущенные варианты
- Размещайте защитные проверки перед оператором выбора; они действуют как условия ветвления
Имитация полноты обработки
Повторение
Повторение: возвращайте значение из классического оператора выбора, добавляйте защитные проверки для условных ветвей и оставляйте ветвь по умолчанию с исключением, чтобы обнаруживать пропущенные варианты.
Часто задаваемые вопросы
Урок «Выражения 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 — локальная установка не требуется.
Все уроки этого курса
- Шаблоны is, реляционные и логические шаблоны (эмуляция в C# 6)
- Выражения switch и исчерпывающие проверки с when (эмуляция в C# 6)
- Моделирование предметной области с размеченными объединениями (записи) — эмуляция в C# 6