Урок C# №7: «Принимаем решения. Часть 2 – оператор switch и тернарный оператор»


Конструкция if.. else в основном всегда удовлетворяет потребности программиста. Однако иногда встречаются моменты, когда нужно выбрать одно условие из нескольких и тогда данная конструкция в C# окажется громоздкой.

Например, представьте себе, что вы пишите программку, в которой пользователю нужно выбрать из нескольких вариантов нужный размер окна и т.д. Допустим, нам нужно выбрать цвет, причем нам представлена стандартная трехцветная гамма RGB (красный, зеленый, синий – те цвета, которые воспринимает человеческий глаз и из которого уже строит отдельную картинку).  Чтобы программа была наглядной, мы будем менять задний фон консоли свойством  BackgroundColor ,который принимает в качестве значения вариант из перечисления ConsoleColor. Что такое перечисления, я расскажу подробно в следующей лекции, а сейчас вам важно знать, что это константный набор значений, доступ к элементам которого осуществляется через точку. Конечно, в данном примере наглядней было бы использовать WindowsForms, однако для обучения лучше все же использовать консоль.

Итак, зная операторы if else, мы могли написать так:


Console.WriteLine ("Введите название любого из трех цветов - красный, зеленый, синий");
String vibor=Console.ReadLine (); // получим цвет
vibor=vibor.ToLower ().Trim (); // чтобы компилятору не ошибиться, приводим всю строку к нижнему регистру
if (vibor=="зеленый")
Console.BackgroundColor=ConsoleColor.Green;
else if (vibor=="красный")
Console.BackgroundColor=ConsoleColor.Red;

else if (vibor=="синий")
Console.BackgroundColor=ConsoleColor.Blue;
else
Console.WriteLine ("Простите, но я не знаю такой цвет");
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);

Давайте поясню немного по коду. Я объявил переменную vibor строкой и считал в нее значение из консоли.  Не забывайте, что все мы люди и кто-то может написать отсебячину с большой буквы или же добавить лишние пробелы. Я уменьшил эти риски, используя метод ToLower () для  преобразования строки в нижний регистр (например, кто-то напишет зеЛеный, а строка в результате применения ToLower () получит значение «зеленый»), а для удаления всех лишних пробелов использовал метод Trim ().

Совет: Всегда предугадывайте все лишние телодвижения пользователя! Нужно максимально продумать все ошибки, которые он может вызвать и предупредить их.

Далее, все уже как и должно быть – мы сравниваем строку с вариантами цвета  в операторе if и красим задний фон в этот цвет. Если пользователь намудрил и ввел не тот цвет или сделал ошибку (например, написал «зиленый»), то в операторе else мы сообщим ему об этом.

Вроде бы, ничего страшного не произошло.  Но что, если мы решим использовать цвета радуги, а? Будем писать семь if else if? Получится весьма громоздко и несколько медленно. К счастью, C# позволяет нам решить данную задачу более изящным путем – используя оператор switch.

Давайте рассмотрим, как работает данный оператор. Его синтаксис прост:

switch (селектор)

{

case  вариант_селектора1: выражение;

break;

case  вариант_селектора2: выражение;

break;

//вариант по умолчанию, аналог else

default:

Выражение, которое должно выполниться по умолчанию;

break;

}

Занятный, синтаксис, не так ли? Однако на практике он выглядит гораздо удобнее, нежели в этом псевдокоде. Нашу задачу с выбором цвета теперь можно решить так:

switch (vibor) {
case "зеленый": Console.BackgroundColor=ConsoleColor.Green; break;
case "красный": Console.BackgroundColor=ConsoleColor.Red; break;
case "синий": Console.BackgroundColor=ConsoleColor.Blue;break;
default:
Console.WriteLine ("Простите, но я не знаю такой цвет"); break;
}

Видите, насколько удобно? Хотя этот синтаксис кажется громоздким, вы к нему очень быстро привыкните и будете часто его использовать в последствии. Кстати, кто не понял, как работает оператор switch, могу посоветовать запустить VC# в режиме отладки (клавиша F11), которую нужно нажимать на каждой операции. Пока отладку оставим в покое для специальной статьи. Вам главное сейчас для себя уяснить, как работает switch.

Переменная vibor является как раз в нашем случае селектором. В зависимости от значения этой переменной, которое мы определяем в ветках case, компилятор решает, как ему поступить в дальнейшем. После case может быть как одно, так и несколько выражений. Обратите внимание на оператор break он прерываем выполнение этой ветки. Без него C# будет сильно материться. Хотя в других языках его можно и опустить – так сравнение побежит по всем веткам, пока не найдется break.

Оператор default по принципу похож  с else. Так же как и там, если условие не выполнится, ход выполнения программы перейдет в ветку default.  Так же как и else, default в switch может и не быть. Имейте это в виду.

Внимание! В C# после выражения в default нужно обязательно ставить break, иначе это будет ошибкой. Так что программисты, изучавшие С имейте это в виду.

Хейлсберг внес в C# еще одно новшество, которое лишь относительно недавно было реализовано в java, а в C++ его до сих пор нет. Дело в том, что еще со времен C селектором могли выступать числовые, символьные типы данных, но не строки. Однако часто требовалось сравнивать именно строки. Поэтому в C# была внедрена эта особенность.

Тернарный оператор

C# в наследство от C досталась сокращенная форма if else, именуемая тернарным оператором. Синтаксис у него весьма экстравагантен:

Условие ? Действие, если условие истина  : Действие, если условие ложь (аналог else);

int vb=12;
Console.WriteLine (vb==12 ? "vb равно 12" : "vb не равно 12");

Сравните это выражение с обычным if else и поймете всю разницу.

На этом ознакомление с операторами выбора в C#  закончено. Приготовьтесь к следующему уроку.

<<Предыдущий урок                                                                 Следующий урок>>

Рубрика: Уроки по C#

Комментарии

7 комментариев на “Урок C# №7: «Принимаем решения. Часть 2 – оператор switch и тернарный оператор»”
  1. Владимир:

    Здравствуйте! Спасибо вам за уроки! Написано очень доступно и понятно. Скажите, как часто они будут выходить?И не планируется выпустить видеоуроки?

  2. Андрей:

    А как же Console.Clear();???? 🙂

    • admin:

      Не понял вопрос.
      Куда нужно было втулить в статью метод очищения содержимого консоли? В этом уроке я не видел нужды использовать данный метод.
      Так что вопрос мне не совсем понятен. Прошу пояснить.

  3. Вадим:

    Заметил, что если в строке приводимого Вами кода, код длинный — его конец не отображается на странице.

  4. Георгий:

    Здравствуйте) Хочу сначала сказать спасибо за статьи))
    Зачем писать Console.ReadeKey(true); , если можно Console.ReadKey(); ?
    В чем разница?)) Спасибо)

    • admin:

      Да, совершенно верно. Разницы никакой, просто это для старых версий C# (вдруг у кого то еще в пользовании VC# 2005)

Добавить комментарий

Внимание! Не будут добавляться комментарии в виде откровенного спама или прямого анкора на свои сайты. Все спамеры будут передаваться в базу Akismet

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: