Оператор 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...");
// Почти пятница...
break;
case DayOfWeek.Friday:
Console.WriteLine("Yes, Friday rules!");
// Да, пятница рулит!
break;
case DayOfWeek.Saturday:
Console.WriteLine("Great day indeed.");
// Действительно великолепный день.
break;
}
Console.WriteLine;
}
Сквозной проход от одного оператора case
к другому оператору case
не разрешен, но что, если множество операторов case
должны вырабатывать тот же самый результат? К счастью, их можно комбинировать, как демонстрируется ниже:
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
Console.WriteLine("It’s the weekend!");
break;
Помещение любого кода между операторами case
приведет к тому, что компилятор сообщит об ошибке. До тех пор, пока операторы case следуют друг за другом, как показано выше, их можно комбинировать для разделения общего кода.
В дополнение к операторам return
и break
, показанным в предшествующих примерах кода, оператор switch
также поддерживает применение goto
для выхода из условия case
и выполнения другого оператора case
. Несмотря на наличие поддержки, данный прием почти повсеместно считается антипаттерном и в общем случае не рекомендуется. Ниже приведен пример использования оператора goto
в блоке switch
:
static void SwitchWithGoto
{
var foo = 5;
switch (foo)
{
case 1:
// Делать что-то
goto case 2;
case 2:
// Делать что-то другое
break;
case 3:
// Еще одно действие
goto default;
default:
// Стандартное действие
break;
}
}
Выполнение сопоставления с образцом в операторах switch (нововведение в версии 7.0, обновление в версии 9.0)
До выхода версии C# 7 сопоставляющие выражения в операторах switch
ограничивались сравнением переменной с константными значениями, что иногда называют switch
способны также задействовать case
могут оценивать тип проверяемой переменной, и выражения case
больше не ограничиваются константными значениями. Правило относительно того, что каждый оператор case
должен завершаться с помощью return
или break
, по-прежнему остается в силе; тем не менее, операторы goto
не поддерживают применение образца с типами.
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT