|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Оператор switch (переключатель)Частным, но важным случаем выбора из нескольких вариантов является ситуация, при которой выбор варианта определяется значениями некоторого выражения. Соответствующий оператор C#, унаследованный от C++, но с небольшими изменениями в синтаксисе, называется оператором switch. Вот его синтаксис: switch(выражение){ case константное_выражение_1: [операторы_1 оператор_перехода_1]... case константное_выражение_K: [операторы_K оператор_перехода_K] [default: операторы_N оператор_перехода_N]}Выполнение оператора начинается с вычисления выражения. Тип выражения чаще всего целочисленный (включая char) или строковый. Затем управление передается первому оператору из списка, помеченному константным выражением, значение которого совпало с вычисленным. Каждая ветвь переключателя должна заканчиваться явным оператором перехода, а именно оператором break, goto или return: Выражение в switch должно иметь целочисленный тип (включая char) или строковый. Ветвь default может отсутствовать. Заметьте, по синтаксису допустимо, чтобы после двоеточия следовала пустая последовательность операторов, а не последовательность, заканчивающаяся оператором перехода. Константные выражения в case должны иметь тот же тип, что и switch-выражение. Семантика оператора switch такова. Вначале вычисляется значение switch-выражения. Затем оно поочередно в порядке следования case сравнивается на совпадение с константными выражениями. Как только достигнуто совпадение, выполняется соответствующая последовательность операторов case-ветви. Поскольку последний оператор этой последовательности является оператором перехода (чаще всего это оператор break), то обычно он завершает выполнение оператора switch. Если значение switch-выражения не совпадает ни с одним константным выражением, то выполняется последовательность операторов ветви default, если же таковой ветви нет, то оператор switch эквивалентен пустому оператору. Разбор случаев - это часто встречающаяся ситуация в самых разных задачах. Применяя оператор switch, используйте его в правильном стиле. Заканчивайте каждую case-ветвь оператором break, но не применяйте goto. Когда разбор случаев предполагает проверку попадания в некоторый диапазон значений, приходится прибегать к оператору if для формирования специальной переменной. Этот прием демонстрируется в следующем примере: /// Определяет период в зависимости от возраста - age/// Использование ветвящегося оператора ifpublic void SetPeriod(){ if ((age > 0)&& (age <7)) period=1; else if ((age >= 7)&& (age <17)) period=2; else if ((age >= 17)&& (age <22)) period=3; else if ((age >= 22)&& (age <27)) period=4; else if ((age >= 27)&& (age <37)) period=5; else period =6;}Этот пример демонстрирует применение ветвящегося оператора if. С содержательной точки зрения он интересен тем, что в поля класса пришлось ввести специальную переменную period, позволяющую в дальнейшем использовать разбор случаев в зависимости от периода жизни: /// Определяет статус в зависимости от периода - period/// Использование разбора случаев - оператора Switchpublic void SetStatus() { switch (period) { case 1: status = "child"; break; case 2: status = "schoolboy"; break; case 3: status = "student"; break; case 4: status = "junior researcher"; break; case 5: status = "senior researcher"; break; case 6: status = "professor"; break; default: status = "не определен"; break; } Console.WriteLine("Имя = {0}, Возраст = {1}, Статус = {2}", name, age, status);}//SetStatusЭтот пример демонстрирует корректный стиль использования оператора switch. В следующем примере показана роль пустых последовательностей операторов case- ветвей для организации списка выражений одного варианта: public void ExprResult(string operation, int arg1, int arg2, int result){ switch (operation) { case "+": case "Plus": case "Плюс": result = arg1 + arg2; break; case "-": case "Minus": case "Минус": result = arg1 - arg2; break; case "*": case "Mult": case "Умножить": result = arg1 * arg2; break; case "/": case "Divide": case "Div": case "разделить": case "Делить": result = arg1 / arg2; break; default: result = 0; Console.WriteLine("Операция не определена"); break; } Console.WriteLine ("{0} ({1}, {2}) = {3}", operation, arg1, arg2, result);}//ExprResultАналогичный пример программы: //Калькулятор на четыре действия using System; namespace ConsoleAppllicationl { class Classl { static void Main() { string buf; double a, b, res; Console.WriteLine("Введите первый операнд:"); buf = Console.ReadLine(); a = double.Parse(buf); Console.WriteLine("Введите знак операции"); char op = (char)Console.Read(); Console. ReadLine(); Console.WriteLine("Введите второй операнд:"); buf = Console. ReadLine(); b = double.Parse(buf); bool ok = true; switch (op) { case '+': res = a + b; break; case '-.': res = a - b; break; case '*': res = a * b; break; case ' /': res = a / b; break; default: res = double.NaN; ok = false; break; } if (ok) Console.WriteLine("Результат:" + res); else Console.WriteLine("Недопустимая операция"); } } } Хотя наличие ветви default и не обязательно, рекомендуется всегда обрабатывать случай, когда значение выражения не совпадает ни с одной из констант. Это облегчает поиск ошибок при отладке программы. Оператор switch предпочтительнее оператора if в тех случаях, когда в программе требуется разветвить вычисления на количество направлений большее двух и выражение, по значению которого производится переход на ту или иную ветвь, не является вещественным. Часто это справедливо даже для двух ветвей, поскольку повышает наглядность программы. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |