Содержание
Программы с линейным выполнением ряда операций встречаются довольно редко. Чаще всего в программе присутствует какая-то «логика», то есть программа выполняет какие-либо операции в зависимости от того, какие действия производит пользователь. Например, если вы пробуете задать недопустимое значение в программе, то вряд ли это действие серьезно отразиться на работоспособности вашего компьютера, скорее всего программа выдаст вам сообщение о том, что введенное значение некорректно и требуется повторить ввод. Все логические операции связаны с логическим типом bool
и, соответственно, результатом выполнения той или иной логической операции может быть только true
(истина) или false
(ложь). Для того, чтобы выстроить логику программы, в C#, как и в других языках программирования, используются логические операции или, как их ещё называют, логические конструкции о которых мы сегодня и поговорим.
Условный оператор switch
Дословно цитируя документацию по языку C#, switch
— это оператор выбора, который выбирает для выполнения один раздел switch из списка кандидатов, сравнивая их с выражением соответствия. Этот оператор часто используется вместо оператора if
, когда требуется проверить более трех условий.
Оператор switch
в C# выглядит следующим образом:
switch (переменная) { case Значение_1: Действия; break (goto, return); case Значение_2: Действия; break (goto, return); case Значение_2: Действия; break (goto, return); default: Действие_по_умолчанию; break; }
Опять же на что обратить внимание. После ключевого слова switch
в круглых скобках указывается переменная, которая будет сравниваться со значениями (напротив ключевого слова case
) и в зависимости от результата сравнения выполнять действия. Если же не одно значение переменной не подойдет ни под один case
— выполнится действие по умолчанию. Действие по умолчанию не является обязательным и может отсутствовать.
В конце каждого блока case устанавливается один из операторов перехода: break
, goto
или return
. Наиболее часто при этом используется break
— прервать дальнейшее выполнение действие в блоках case
.
На первый взгляд switch
выглядит немного запутанно по сравнению с аналогичным оператором case..of
из Delphi, но, при детальном рассмотрении возможностей этого оператора становится понятно почему разработчики C# сделали именно такую конструкцию, а не другую.
Рассмотрим пример, когда использование оператора if
не желательно так как приводит к усложнению восприятия исходного кода, а со switch код станет намного понятнее. Пусть наша программа будет выводить название дня недели по введенному пользователем числу от 1 до 7 где 1 — это понедельник, а 7, соответственно, воскресенье. Для экономии времени я упущу необходимые проверки того, что вводит пользователь в консоли и оставлю только оператор switch
.
Console.WriteLine("Введите целое число от 1 до 7:"); int i = int.Parse(Console.ReadLine()); switch (i) { case 1: Console.WriteLine("Понедельник"); break; case 2: Console.WriteLine("Вторник"); break; case 3: Console.WriteLine("Среда"); break; case 4: Console.WriteLine("Четверг"); break; case 5: Console.WriteLine("Пятница"); break; case 6: Console.WriteLine("Суббота"); break; case 7: Console.WriteLine("Воскресенье"); break; default: Console.WriteLine("Что ты наделал?"); break; }
Теперь можете самостоятельно попробовать составить ту же самую программу, но только, используя оператор if
и наглядно увидите, что switch
делает код намного более читабельным. В приведенном примере мы использовали оператор перехода break
. Посмотрим как внутри switch
можно использовать оператор goto
.
switch (i) { case 1: Console.WriteLine("Понедельник"); break; case 2: Console.WriteLine("Вторник"); break; case 3: Console.WriteLine("Среда"); break; case 4: Console.WriteLine("Четверг, а завтра..."); goto case 5; case 5: Console.WriteLine("Пятница!!!"); break; case 6: Console.WriteLine("Суббота"); break; case 7: Console.WriteLine("Воскресенье"); break; default: Console.WriteLine("Что ты наделал?"); break; }
Обратите внимание на блок case 4
— здесь использован оператор перехода goto
на блок case 5
. Если пользователь вводит число 4, то программа вначале заходит в case 4
, выводит строку с названием недели, затем, благодаря оператору goto
переходит в case 5
, снова выводит строку и уже в case 5
встречает оператор break
и выходит за пределы оператора switch
. Что касается оператора return, то он завершает выполнение метода, в котором он присутствует, и возвращает управление вызывавшему методу и в операторе switch используется реже, чем break
и goto
, поэтому пример с return рассматривать не будем, а лучше посмотрим на улучшенную версию switch
, которая появилась в C# 8.0.
Выражения switch в C# 8.0
Начиная с версии C# 8.0 в языке появилось выражение switch. Выражения switch позволяют упростить код, который возвращает какое-либо значение. Чтобы было более понятно в чём суть введения в язык нового элемента составим нашу программу определения названий дней недели, используя выражение switch
. Для начала приведу весь исходный код программы:
using System; namespace ConsoleApp1 { class Program { static string DayName(int dayOfWeek) { return dayOfWeek switch { 1 => "Понедельник", 2 => "Вторник", 3 => "Среда", 4 => "Четверг", 5 => "Пятница", 6 => "Суббота", 7 => "Воскресенье", _ => "Что ты наделал?!", }; } static void Main(string[] args) { Console.WriteLine("Введите целое число от 1 до 7:"); int i = int.Parse(Console.ReadLine()); Console.WriteLine(DayName(i)); _ = Console.ReadLine(); } } }
На что обратить внимание. Во-первых, мы создали отдельный метод DayName()
, который возвращает название дня недели. В этом методе мы и используем выражение switch
для возврата значения. Отличия выражение switch
от одноименного условного оператора следующие:
- выражение возвращает значение, в то время, как оператор
switch
никакого значения может и не возвращать (см. примере в предыдущем разделе — тамswitch
ничего не возвращал, а использовался только для вывода строки на экран. - элементы
case :
заменены на более лаконичный и интуитивно понятный вариант=>
- в выражении ключевое слово
switch
стоит после переменной - default заменено на пустую переменную
_
.
Может сложиться впечатление, что для использования выражения switch
обязательно требуется писать отдельный метод. Совсем не обязательно — это просто я решал заодно показать для чего используется оператор перехода return
, а вообще, можно было бы написать программу и так:
namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.WriteLine("Введите целое число от 1 до 7:"); int i = int.Parse(Console.ReadLine()); string dayOfWeek = i switch { 1 => "Понедельник", 2 => "Вторник", 3 => "Среда", 4 => "Четверг", 5 => "Пятница", 6 => "Суббота", 7 => "Воскресенье", _ => "Что ты наделал?!", }; Console.WriteLine(dayOfWeek); _ = Console.ReadLine(); } } }
Здесь значение выражения присваивается переменной dayOfWeek
.
Тернарная операция (сокращенная проверка)
Тернарная операция (иногда говорят — сокращенная проверка) позволяет сократить исходный код программы с операторами if
и сделать код более лаконичным и интуитивно понятным. Выглядит сокращенная проверка следующим образом:
Условие ? Действие1 : Действие2
Здесь все просто: вначале идет условие, истинность которого необходимо проверить. Если условие истинно (равно true
), то выполняется Действие1, если условие ложно (равно false
) — выполняется Действие2. Для примера, напишем программу проверки чисел на чётность. Вот как будет выглядеть программа с использованием тернарной операции:
Console.WriteLine("Введите число от 0 до 10:"); int i = int.Parse(Console.ReadLine()); //используем тернарную операцию Console.WriteLine((i % 2 == 0) ? $"{i} - четное число" : $"{i} - нечетное число"); _ = Console.ReadLine();
Дословно можно прочитать нашу тернарную операцию следующим образом образом: если остаток от деления i
на 2 равен нулю, то число четное, иначе — нечетное.
Периодически Visual Studio сама предлагает упростить код и использовать тернарные операции, что делает работу с C# ещё удобнее и легче.
Итого
Сегодня мы вместе изучили какие условные конструкции могут использоваться в C# и как они работают, познакомились с выражениями switch
, а также рассмотрели тернарные операции C#. Теперь наши программы могут использовать в работе «логику».