Перейти к основному содержимому

Разветвление потока кода с помощью конструкции switch-case в C#.

Язык программирования C# похож на любой человеческий письменный или разговорный язык. Каждый из них поддерживает различные способы выражения одной и той же идеи. В разговорном языке некоторые слова и фразы более описательны, точны и лаконичны, чем другие. В языке программирования C# существует более одного способа создания разветвленной логики. Например, выборки, использующие операторы if, и выборки, использующие операторы switch. В зависимости от контекста вашего приложения один тип оператора выбора может быть более выразительным и лаконичным, чем другой.

Предположим, что вы работаете над приложениями, в которых широко используются операторы выбора. В некоторых случаях конструкции if-elseif-else используются для создания лаконичного и выразительного кода, который легко читать и поддерживать. В других случаях конструкции if-elseif-else приводят к требуемому результату, но их трудно читать и поддерживать. Вам было поручено проанализировать код и определить, когда целесообразно использовать оператор switch, а не оператор if.

В этом модуле вы изучите использование оператора switch для реализации логики ветвления в качестве альтернативы оператору if. Вы также поработаете над преобразованием конструкции if-elseif-else в конструкцию switch-case. В ходе этого процесса вы научитесь распознавать преимущества выбора одного типа оператора выбора над другим.

К концу этого модуля вы сможете применять операторы switch в своем приложении, определять, когда следует использовать оператор switch, а когда конструкцию if-elseif-else, и преобразовывать конструкции if-elseif-else в операторы switch.

Цели обучения

В этом модуле вы научитесь:

  • Использовать конструкцию switch-case для сопоставления переменной или выражения с несколькими возможными исходами.
  • Преобразовывать код, использующий конструкцию if-elseif-else, в конструкцию switch-case.

Упражнение - Реализация оператора switch

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

Рассмотрим следующий сценарий:

  • Вы работаете над приложением, связанным с питанием. Один из разделов кода посвящен фруктам.
  • Ваш код включает переменную с именем fruit, которая используется для хранения названий различных типов фруктов.
  • У вас есть список из 20 фруктов, на которые ориентировано ваше приложение.
  • Вы хотите разветвить код на основе значения, присвоенного переменной fruit.

В этом сценарии вы можете использовать оператор switch, чтобы создать отдельную ветку для каждого вида фруктов.

Как работает оператор switch?

Оператор switch выбирает одну секцию кода для выполнения из списка возможных секций switch. Выбранная секция switch выбирается на основе совпадения шаблона с выражением совпадения оператора.

Рассмотрим следующий пример кода, который демонстрирует основную структуру оператора switch:

switch (fruit)
{
case "apple":
Console.WriteLine($"App will display information for apple.");
break;

case "banana":
Console.WriteLine($"App will display information for banana.");
break;

case "cherry":
Console.WriteLine($"App will display information for cherry.");
break;
}

Выражение соответствия (которое также может называться выражением переключателя) - это значение, следующее за ключевым словом переключателя, в данном случае (fruit). Каждый раздел switch определяется шаблоном case. Шаблоны case строятся с использованием ключевого слова case, за которым следует значение. Первым шаблоном в этом примере является: case "apple":. Case-шаблоны - это булевы выражения, которые оцениваются либо как true, либо как false. Каждая секция switch включает небольшое количество строк кода, которые будут выполнены, если шаблон case совпадает с выражением. В этом примере, если fruit присвоено значение "яблоко", первый шаблон case будет оценен как true и будет выполнен этот раздел switch.

Оператор switch должен включать как минимум одну секцию switch, но обычно содержит три или более секций switch.

Switch лучше всего использовать, когда:

  • у вас есть одно значение (переменная или выражение), которое вы хотите сопоставить с множеством возможных значений.
  • Для любого сопоставления вам нужно выполнить не более пары строк кода.
примечание

Этот первый пример оператора switch намеренно прост, и ваше знакомство с синтаксисом было кратким. Вы будете изучать дополнительные возможности оператора switch, когда будете работать с более сложными сценариями в следующих разделах.

Пришло время приступить к разработке собственных операторов switch.

Создайте и протестируйте оператор switch

  1. Создайте новый проект
  2. Введите следующий код в редактор кода Visual Studio:
int employeeLevel = 200;
string employeeName = "John Smith";

string title = "";

switch (employeeLevel)
{
case 100:
title = "Junior Associate";
break;
case 200:
title = "Senior Associate";
break;
case 300:
title = "Manager";
break;
case 400:
title = "Senior Manager";
break;
default:
title = "Associate";
break;
}

Console.WriteLine($"{employeeName}, {title}");
  1. Сохраните и запустите ваш код. Вы должны увидеть:
John Smith, Senior Associate
  1. Уделите минуту просмотру введенного вами оператора switch.

  2. Обратите внимание, что оператор switch определяет один блок кода. Оператор switch определяет один блок кода, который включает в себя список секций switch. Справа от ключевого слова switch находится выражение switch, заключенное в круглые скобки.

  3. Обратите внимание на список секций переключателей внутри блока кода.

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

Выражение switch оценивается по меткам case сверху вниз до тех пор, пока не будет найдено значение, равное выражению switch. Если ни одна из меток не совпадает, будет выполнен список операторов для случая по умолчанию. Если по умолчанию нет, управление передается в конечную точку оператора switch. Каждая метка должна содержать тип значения, соответствующий типу, указанному в выражении switch.

примечание

Необязательная метка default может располагаться в любой позиции списка секций переключателя. Однако большинство разработчиков предпочитают размещать ее на последнем месте, поскольку с точки зрения логики более логично размещать default в качестве последней опции. Независимо от позиции, раздел default будет оцениваться последним.

В нашем примере:

  • выражение switch - (employeeLevel),
  • каждая секция switch имеет одну метку switch (case или default).
  • совпадающая секция switch определяется case: 200, поскольку employeeLevel = 200.
  1. Обратите внимание, что каждая секция переключателя отделена от следующей. Разрешается выполнять только одну секцию переключателя. Это означает, что выполнение секции switch не может "провалиться" в следующую секцию switch. Ключевое слово break - это один из нескольких способов завершить секцию switch до того, как она перейдет к следующей секции. Если вы забудете ключевое слово break (или, как вариант, ключевое слово return), компилятор выдаст ошибку.

Измените значение переменной level и посмотрите, как ее оценивает оператор switch

  1. Чтобы отработать вариант по умолчанию, давайте изменим уровень сотрудника, изменив присвоенные значения.
int employeeLevel = 201;
  1. Чтобы назначить несколько меток первой секции переключателя, обновите код следующим образом:
case 100:
case 200:
title = "Senior Associate";
break;

Когда вы закончите вносить изменения, ваши модификации должны соответствовать следующему коду:

int employeeLevel = 100;
string employeeName = "John Smith";

string title = "";

switch (employeeLevel)
{
case 100:
case 200:
title = "Senior Associate";
break;
case 300:
title = "Manager";
break;
case 400:
title = "Senior Manager";
break;
default:
title = "Associate";
break;
}

Console.WriteLine($"{employeeName}, {title}");
  1. Сохраните файл с кодом, а затем используйте Visual Studio для запуска кода.
John Smith, Senior Associate

Обе метки кейсов 100 и 200 теперь сопряжены с секцией switch, которая устанавливает для заголовка строковое значение Senior Associate.

Подведение итогов

Вот основные выводы, которые вы узнали об операторе switch:

  • Используйте оператор switch, когда у вас есть одно значение с множеством возможных соответствий, каждое из которых требует ответвления в логике кода.
  • Одна секция switch, содержащая логику кода, может быть сопоставлена с помощью одной или нескольких меток, определяемых ключевым словом case.
  • Используйте необязательное ключевое слово default, чтобы создать метку и секцию switch, которая будет использоваться, когда не совпадут другие метки case.

Упражнение - Выполните задание с использованием операторов switch

Задача «Преобразование в операторы switch

В этой задаче вам предстоит переписать конструкцию if-elseif-else как оператор switch. Эта задача должна помочь вам увидеть сильные и слабые стороны оператора switch по сравнению с конструкцией if-elseif-else. Удачи.

Перепишите if-elseif-else с помощью оператора switch

Вы начнете с кода, который использует конструкцию if-elseif-else для оценки компонентов SKU продукта. SKU (Stock Keeping Unit) форматируется с помощью трех кодированных значений: <product #>-<2-буквенный код цвета>-<код размера>. Например, значение SKU 01-MN-L соответствует (sweat shirt)-(maroon)-(large), и код выводит описание, которое выглядит как «Product: Large Maroon Sweat shirt».

Ваша задача - преобразовать код оператора if в оператор switch, который достигает того же результата, что и исходный код.

  1. Создайте новый проект
  2. Введите следующий код в редактор кода Visual Studio:
// SKU = Stock Keeping Unit. 
// SKU value format: <product #>-<2-letter color code>-<size code>
string sku = "01-MN-L";

string[] product = sku.Split('-');

string type = "";
string color = "";
string size = "";

if (product[0] == "01")
{
type = "Sweat shirt";
} else if (product[0] == "02")
{
type = "T-Shirt";
} else if (product[0] == "03")
{
type = "Sweat pants";
}
else
{
type = "Other";
}

if (product[1] == "BL")
{
color = "Black";
} else if (product[1] == "MN")
{
color = "Maroon";
} else
{
color = "White";
}

if (product[2] == "S")
{
size = "Small";
} else if (product[2] == "M")
{
size = "Medium";
} else if (product[2] == "L")
{
size = "Large";
} else
{
size = "One Size Fits All";
}

Console.WriteLine($"Product: {size} {color} {type}");
  1. Обновите код, чтобы вместо конструкции if-elseif-else использовать оператор switch.
  2. Убедитесь, что вывод не изменился. Независимо от того, как вы это сделаете, ваш код должен выдать следующий результат:
Product: Large Maroon Sweat shirt

Заключение

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

Используя конструкцию switch-case, вы сопоставили числовой уровень сотрудника с его должностью. Вы использовали switch-case в качестве замены конструкции if-elseif-else, чтобы более лаконично выразить свое намерение преобразовать единицу учета запасов (SKU) в длинное описание.

Разработчики C# используют операторы выбора if и switch, а также условные операторы для ветвления своего кода. Полученный опыт использования операторов выбора позволит вам выбрать лучший инструмент C# для выражения ваших намерений в коде.