Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Оператор switch






Часткою, але важливим випадком вибору з декількох варіантів є ситуація, при якій вибір варіанта визначається значеннями деякого вираження. Відповідній оператор в C# називається оператором switch. Його синтаксис:

switch(вираження){ case константне_вираження_1: [оператори_1 оператор_переходу_1]... case константне_вираження_K: [оператори_K оператор_переходу_K] [default: оператори_N оператор_переходу_N]}

Галузь default може бути відсутнім. Помітьте, по синтаксису припустимо, щоб після двокрапки випливала порожня послідовність операторів, а не послідовність, що закінчується оператором переходу. Константні вираження в case повинні мати тій же тип, що й switch-вираження.

Семантика оператора switch дещо заплутана. Спочатку обчислюється значення switch-вираження. Потім воно по черзі в порядку проходження case рівняється на збіг з константними вираженнями. Як тільки досягнутий збіг, виконується відповідна послідовність операторів case-галузі. Оскільки останній оператор цієї послідовності є оператором переходу (найчастіше це оператор break), то звичайно він завершує виконання оператора switch. Використання операторів переходу - це погана ідея. Таким оператором може бути оператор goto, що передає керування іншої case-галузі, що, у свою чергу, може передати керування ще куди-небудь, одержуючи блюдо " спагетті" замість добре структурованої послідовності операторів. Семантика ускладнюється ще й тим, що case-галузь може бути порожньою послідовністю операторів. Тоді у випадку збігу константного вираження цієї галузі зі значенням switch- послідовність), інакше виникне помилка періоду компіляції.

Розбір випадків - часто зустрічається ситуація в самих різних завданнях. Застосовуючи оператор switch, пам’ятайте про недоліки його синтаксису, використайте його в правильному стилі. Закінчуйте кожну case-галузь оператором break, але не застосовуйте goto.

Коли розбір випадків припускає перевірку влучення в деякий діапазон значень, доводиться прибігати до оператора if для формування спеціальної змінної. Цей прийом демонструється в наступному прикладі, де йде робота над даними нашого класу Testing:

/// < summary> /// Визначає період поклад від віку - age/// Використання оператора if, що гілкується/// < /summary> public 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, що дозволяє надалі використати розбір випадків поклад від періоду життя:

/// < summary> /// Визначає статус покладу від періоду - period/// Використання розбору випадків - оператора Switch/// < /summary> public 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-галузей для організації списку виражень одного варіанта:

/// < summary> /// Розбір випадків з використанням списків виражень/// < /summary> /// < param name=" operation" > операція над аргументами< /param> /// < param name=" arg1" > перший аргумент бінарної операції< /param> /// < param name=" arg2" > другий аргумент бінарної операції< /param> /// < param name=" result" > результат бінарної операції< /param> public void ExprResult(string operation, int arg1, int arg2 ref 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

Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал