0Pricing
C# Academy · Урок

Выражения switch

Компактные switch, возвращающие значения.

«Выражения switch» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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 и 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);
    }
}

Шаблоны-константы

В простейшей ветви используется шаблон-константа: литеральное значение, с которым входное значение сравнивается на равенство.

Константами могут быть числа, строки, символы, элементы перечислений или именованные константы. Они проверяются сверху вниз, поэтому сначала размещайте наиболее специфичные или наиболее распространённые ветви.

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 добавляет к ветви логическое условие. Ветвь соответствует значению только тогда, когда истинны и шаблон, и это условие.

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

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» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Выражения switch»?

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

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

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Выражения switch»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Выражения switch
  2. Шаблоны типов и свойств
  3. Реляционные и логические шаблоны
  4. Шаблоны списков и кортежей
← Назад к C# Academy