Содержание
Программы с линейным выполнением ряда операций встречаются довольно редко. Чаще всего в программе присутствует какая-то «логика», то есть программа выполняет какие-либо операции в зависимости от того, какие действия производит пользователь. Например, если вы пробуете задать недопустимое значение в программе, то вряд ли это действие серьезно отразиться на работоспособности вашего компьютера, скорее всего программа выдаст вам сообщение о том, что введенное значение некорректно и требуется повторить ввод. Все логические операции связаны с логическим типом 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#. Теперь наши программы могут использовать в работе «логику».