Логические операции в C#

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

  1. выражение возвращает значение, в то время, как оператор switch никакого значения может и не возвращать (см. примере в предыдущем разделе — там switch ничего не возвращал, а использовался только для вывода строки на экран.
  2. элементы case : заменены на более лаконичный и интуитивно понятный вариант =>
  3. в выражении ключевое слово switch стоит после переменной
  4. 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#. Теперь наши программы могут использовать в работе «логику». 

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии