Оператор Switch
Операторы if-else с несколькими ветвями
Методика, в которой значение переменной определяет, какой оператор (или составное выражение) из возможных следует исполнять, настолько распространена в программировании, что была выработана стандартизованная система создания структур if-else, реализующих эту функциональность. Результирующие структуры называются операторами if-elseс несколькими ветвями.
Оператор_if_else_с_несколькими_ветвями::=
if (<Логическое_выражение_1>)
<Оператор_1> | <Составной_оператор_1>
else if (<Логическое_выражение_2>)
<Оператор_2>; | <Составной_оператор_2>
else if (<Логическое_выражение_3>)
<Оператор_3>; | <Составной_оператор_3>
else
<Оператор_по_умолчанию>; | <Составной_оператор_по_умопчанию>
Рассмотрим пример. Разработать программу, которая идентифицирует введенное число, определяя, относится ли оно к диапазону целых чисел от 1 до 5. Если оно относится к этому диапазону, то это число выводится на консоль совместно с сообщением «Число принадлежит диапазону от 1 до 5», в противном случае выводится сообщение «Число не входит в указанный диапазон».
|
|
Оператор switchпозволяет программе выбрать одно из нескольких действий на основе значения заданного выражения. Логика, реализуемая switch,подобна логике оператора if-else.Их сходства и отличия иллюстрируются примером.
Рассмотрим программу, которая осуществляет различные арифметические действия в зависимости от названия действия. Например, если в командной строке написать «суммирование»,то программа вычислит сумму введенных чисел. Для реализации этой программы использовать оператор if else.
using System;
class calculator
{
public static void Main()
{
string operation;
int a, b, c;
Console.WriteLine("Введите числа");
a=Convert.ToInt32(Console.ReadLine());
b=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите действие: сложение, вычитание, умножение, деление.");
operation=Console.ReadLine();
if (operation=="сложение")
Console.WriteLine("Сумма введенных чисел {0}",a+b);
else if (operation=="вычитание")
Console.WriteLine("Разность введенных чисел {0}",a-b);
else if (operation=="умножение")
Console.WriteLine("Произведение введенных чисел {0}",a*b);
else if (operation=="деление")
Console.WriteLine("Разность введенных чисел {0}",a/b);
else
Console.WriteLine("Введенная операция отсутствует");
Console.ReadLine();
}
}
Оператор switchпозволяет кратко выразить логику оператора if-else,приведенного в примере, с помощью более жесткой структуры.
Рассмотрим синтаксический блок оператора switch.
Switch (<Выражение для switch>)
case <Константное выражение>:
< Оператор1 >;
< Оператор2>;
...
< Оператор break>
case <Константное выражение>:
< Оператор1 >;
|
|
< Оператор2>;
...
< Оператор break>
...
default:
< Оператор1 >;
< Оператор2>;
...
< Оператор break>
<Выражение для switch> - это управляющее выражение.
сase, default – называются разделами выбора.
<Константное выражение> - следует за ключевым словом case и называется case-значением или case-меткой. Причем, каждая из них должна быть уникальной.
< Оператор break> - используется для завершения раздела выбора.
Примечание:
1. Количество блоков case не ограничено.
2. Блок default может быть один или не одного.
Напишем программу для предыдущего примера с использованием оператора switch.
using System;
class calculator
{
public static void Main()
{
string operation;
int a, b, c;
Console.WriteLine("Введите числа");
a=Convert.ToInt32(Console.ReadLine());
b=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите действие: сложение, вычитание, умножение, деление.");
operation=Console.ReadLine();
switch (operation)
{
case "сложение":
Console.WriteLine("Сумма введенных чисел {0}",a+b);
break;
case "вычитание":
Console.WriteLine("Разность введенных чисел {0}",a-b);
break;
case "умножение":
Console.WriteLine("Произведение введенных чисел {0}",a*b);
break;
case "деление":
Console.WriteLine("Разность введенных чисел {0}",a/b);
break;
default:
Console.WriteLine("Введенная операция отсутствует");
break;
}
Console.ReadLine();
}
}
Когда поток управления переходит от одного раздела switch к другому, такое выполнение называется провалом. Для его предотвращения применяется оператор break.
Рекомендации по использованию оператора switch
Ниже приведены основные рекомендации по использованию оператора switch.
Ограничение числа операторов в каждом разделе switch. Некоторые операторы switch содержат большое число разделов. Обилие операторов в них запутывает код. Поэтому сложные действия, требующие вызова большого числа команд, следует выносить в отдельные методы и вызывать их из разделов switch.
Упорядочение разделов по вхождению, номеру или символу (в алфавитном порядке). Простые операторы switch, представленные в примерах этого раздела, содержат небольшое число разделов, и их логику легко понять с первого взгляда. Однако многие конструкции switch могут быть достаточно протяженными, что значительно затрудняет их чтение, Схема, в которой метки case упорядочены, повышает читаемость кода.
Существует несколько возможных схем:
1. Схемапо вхождению — если те разделы switch,которые запускаются наиболее часто, расположены в начале, это упрощает восстановление логики кода. Кроме того, это ускоряет его, так как редко используемые блоки не будут обрабатываться при каждом проходе.
2. Схемав алфавитном или числовом порядке— для упрощения навигации по меткам желательно расположить их в алфавитном или числовом порядке.
Использование раздела default с той же целью, что и выражение по умолчанию в операторе if-else с несколькими ветвями. Обратимся к двум основным правилам, обсуждавшимся при рассмотрении оператора if-else с несколькими ветвями, о выражении по умолчанию, следующем за последним условием else. Они применимы и к разделу default оператора switch:
1. Раздел default следует использовать только для тех действий, которые должны выполняться по умолчанию.
2. Если он не используется, в нем следует обрабатывать ошибки.
В большинстве программ, рассмотренных ранее, для обозначения контекста класса или метода, в частности, метода Main(), использовались блочные конструкции с фигурными скобками.
С введением операторов if-else (которые могут содержать составные операторы) появилась возможность создавать программы, включающие вложенные блоки кода. Здесь важно представить новую концепцию, называемую областью видимости. Она определяет, какие сегменты (а значит, и переменные) исходного кода видны (и, таким образом, доступны) из других его частей. Область видимости — это технический термин, используемый для неформального словесного контекста.
|
|
Область видимости представляет собой сегмент исходного кода, где может использоваться определенный идентификатор. Переменные можно использовать лишь внутри их области видимости. Фактически, областью видимости переменной является тот блок исходного кода, где она объявлена.
Две основных области видимости в С # блок класса и блок метода, как показано на рисунке.
Хотя различие между ними, скорее, искусственное, область определения класса имеет несколько характеристик, отсутствующих в области определения метода. Например, операторы if-else можно разместить только в области определения метода. Для создания блока внутри блока совсем не обязательно использовать выражения наподобие if-else. Новый блок (а значит, и новую область видимости) можно создать, просто вставив пару фигурных скобок. Когда блок В находится внутри другого блока А, область видимости первого называется внутренней, а второго — внешней. Эти термины несут, очевидно, относительный смысл, поскольку область блока А является внутренней по отношению к области блока Main(). Блоки, созданные добавлением фигурных скобок, не имеют явных имен, и ссылаться на них нельзя.
Переменная, объявленная внутри метода, называется локальной.
Такие переменные недоступны за пределами блоков, в которых они объявлены. Общее правило гласит, что переменные, объявленные внутри блока, доступны только в нем (это относится и к переменным других внутренних блоков, вложенных в него) и только после объявления переменной. Переменную можно объявить в любом месте блока.
Действие этих правил иллюстрирует следующий рисунок. Здесь показаны два блока кода: один принадлежит методу Main(), а другой (размешенный внутри Main() — оператору if). Поскольку переменная distance объявлена в начале внешней области видимости, она доступна во всем блоке Main(), включая и код внутреннего блока оператора if.Переменная mass объявлена ближе к окончанию метода Main(). поэтому она доступна в относительно небольшом сегменте кода, между ее объявлением и окончанием области видимости Main(). Переменная energy объявлена внутри блока if и доступна лишь внутри него.
|
|
Объявление переменной во внутренней области с именем, идентичным имени переменной во внешней, является ошибкой. Причина заключается в том, что это придавало бы иное значение имени переменной из внешней области.