Выбрать главу

Использование оператора switch

Еще одной простой конструкцией C# для реализации выбора является оператор switch. Как и в остальных основанных на С языках, оператор switch позволяет организовать выполнение программы на основе заранее определенного набора вариантов. Например, в следующем коде для каждого из двух возможных вариантов выводится специфичное сообщение (блок default обрабатывает недопустимый выбор):

// Switch on a numerical value.

static void SwitchExample()

{

  Console.WriteLine("1 [C#], 2 [VB]");

  Console.Write("Please pick your language preference: ");

                // Выберите предпочитаемый язык:

  string langChoice = Console.ReadLine();

  int n = int.Parse(langChoice);

  switch (n)

  {

    case 1:

      Console.WriteLine("Good choice, C# is a fine language.");

                   // Хороший выбор. C# - замечательный язык.

      break;

    case 2:

      Console.WriteLine("VB: OOP, multithreading, and more!");

                   // VB: ООП, многопоточность и многое другое!

      break;

    default:

      Console.WriteLine("Well...good luck with that!");

                   // Что ж... удачи с этим!

      break;

  }

}

На заметку! Язык C# требует, чтобы каждый блок case (включая default), который содержит исполняемые операторы, завершался оператором return, break или goto во избежание сквозного прохода по блокам.

Одна из замечательных особенностей оператора switch в C# связана с тем, что вдобавок к числовым значениям он позволяет оценивать данные string. На самом деле все версии C# способны оценивать типы данных char, string, bool, int, long и enum. В следующем разделе вы увидите, что в версии C# 7 появились дополнительные возможности. Вот модифицированная версия оператора switch, которая оценивает переменную типа string:

static void SwitchOnStringExample()

{

  Console.WriteLine("C# or VB");

  Console.Write("Please pick your language preference: ");

  string langChoice = Console.ReadLine();

  switch (langChoice.ToUpper())

  {

    case "C#":

      Console.WriteLine("Good choice, C# is a fine language.");

      break;

    case "VB":

      Console.WriteLine("VB: OOP, multithreading and more!");

      break;

    default:

      Console.WriteLine("Well...good luck with that!");

      break;

  }

}

Оператор switch также может применяться с перечислимым типом данных. Как будет показано в главе 4, ключевое слово enum языка C# позволяет определять специальный набор пар "имя-значение". В качестве иллюстрации рассмотрим вспомогательный метод SwitchOnEnumExample(), который выполняет проверку switch для перечисления System.DayOfWeek. Пример содержит ряд синтаксических конструкций, которые пока еще не рассматривались, но сосредоточьте внимание на самом использовании switch с типом enum; недостающие фрагменты будут прояснены в последующих главах.

static void SwitchOnEnumExample()

{

  Console.Write("Enter your favorite day of the week: ");

              // Введите любимый день недели:

  DayOfWeek favDay;

  try

  {

    favDay = (DayOfWeek) Enum.Parse(typeof(DayOfWeek), Console.ReadLine());

  }

  catch (Exception)

  {

    Console.WriteLine("Bad input!");

                    // Недопустимое входное значение!

    return;

  }

  switch (favDay)

  {

  case DayOfWeek.Sunday:

      Console.WriteLine("Football!!");

                      // Футбол! !

      break;

    case DayOfWeek.Monday:

      Console.WriteLine("Another day, another dollar");

                      // Еще один день, еще один доллар.

      break;

    case DayOfWeek.Tuesday:

      Console.WriteLine("At least it is not Monday");

                      // Во всяком случае, не понедельник.

      break;

    case DayOfWeek.Wednesday:

      Console.WriteLine("A fine day.");

                      // Хороший денек.

      break;

    case DayOfWeek.Thursday:

      Console.WriteLine("Almost Friday...");

                      // Почти пятница...