C# - Головна Простір імен
► System (5)► Microsoft (1) Для учнів (початківців)
► Відео уроки (4)► Навчання (177) ► Приклади програм (19) ► Секрети Сі Шарп (4) Для професіоналів
► Навчання (6)► Приклади програм (1) |
Оператори мови C#
Склад операторів мови C#, їх синтаксис і семантика успадковані від мови С++. Як і належить, нащадок частково доповнив склад, перевизначав синтаксис і семантику окремих операторів, намагався поліпшити характеристики мови на благо програміста. Подивимося, наскільки це вдалося мові C#. Оператор присвоювання Як у мові С++, так і в C# присвоювання формально вважається операцією. Разом з тим запис: X = expr; слід вважати справжнім оператором присвоювання, так само, як і одночасне присвоювання зі списком змінних в лівій частині: X1 = X2 = ... = Xk = expr; Блок або складений оператор З допомогою фігурних дужок кілька операторів мови (можливо, перемежаються оголошеннями) можна об'єднати в єдину синтаксичну конструкцію, звану блоком або складовим оператором: { оператор_1 ... оператор_N } Синтаксично блок сприймається як одиничний оператор і може використовуватися всюди в конструкціях, де синтаксис вимагає одного оператора. Тіло циклу, гілки оператора if, як правило, представляються блоком. Порожній оператор - це "порожньо", завершаемое крапкою з комою. Іноді корисно розглядати відсутність операторів як існуючий порожній оператор. Синтаксично допустимо ставити зайві точки з комою, вважаючи, що вставляються порожні оператори. Оператори вибору Як в С++ та інших мовах програмування, в мові C# для вибору однієї з кількох можливостей використовуються дві конструкції - if switch. Першу з них звичайно називають альтернативним вибором, другу - розбором випадків. Оператор if Почнемо з синтаксису оператора if: if(выражение_1) оператор_1 else if(вираз-2) оператор_2 ... else if(выражение_К) оператор_К else оператор_N Які особливості синтаксису слід відзначити? Вираження if повинні полягати в круглі дужки і бути булевого типу. Точніше, вирази повинні давати значення true або false. Нагадаю, арифметичний тип не має явних або неявних перетворень до булевому типу. За правилами синтаксису мови С++, then-гілка оператора слід відразу за круглою дужкою без ключового слова then, типового для більшості мов програмування. Кожен з операторів може бути блоком - зокрема, if-оператором. Тому можлива і така конструкція: if(выражение1) if(выражение2) if(выражение3) ... Гілки else if, що дозволяють організувати вибір з багатьох можливостей, можуть бути відсутніми. Може бути опущена і заключна else-гілка. У цьому випадку коротка форма оператора if задає альтернативний вибір - робити чи не робити - виконувати чи не виконувати then-оператор. Семантика оператора if проста і зрозуміла. Вираження if перевіряються у порядку їх написання. Як тільки отримано значення true, перевірка припиняється і виконується оператор (це може бути блок), який слідує за виразом, отримали значення true. З завершенням цього оператора завершується і оператор if. Гілка else, якщо вона є, відноситься до найближчого відкритого if. Оператор switch Приватним, але важливим випадком вибору з декількох варіантів є ситуація, при якій вибір варіанту визначається значеннями деякого виразу. Відповідний оператор C#, успадкований від C++, але з невеликими змінами в синтаксисі, називається оператором switch. Ось його синтаксис: switch(вираз) { case константное_выражение_1: [операторы_1 оператор_перехода_1] ... case константное_выражение_К: [операторы_К оператор_перехода_К] [default: операторы_N оператор_перехода_N] } Гілку default може бути відсутнім. Зауважте, по синтаксису допустимо, щоб після двокрапки йшла порожня послідовність операторів, а не послідовність, що закінчується оператором переходу. Константные вираження в case повинні мати той же тип, що і switch-вираз. Семантика оператора switch трохи заплутана. Спочатку обчислюється значення switch-вирази. Потім воно почергово у порядку слідування case порівнюється на збіг з константними виразами. Як тільки досягнуто збіг, виконується відповідна послідовність операторів case-гілки. Оскільки останній оператор цієї послідовності є оператором переходу (найчастіше це оператор break), то зазвичай він завершує виконання оператора switch. Використання операторів переходу - це погана ідея. Таким оператором може бути оператор goto, передає управління іншій case-гілки, яка, в свою чергу, може передати управління ще куди-небудь, отримуючи блюдо "спагеті" замість добре структурованої послідовності операторів. Семантика ускладнюється ще й тим, що case-гілка може бути порожньою послідовністю операторів. Тоді в разі збігу константного вираження цієї гілки зі значенням switch-виразу буде виконуватися перша не пустий послідовність черговий case-гілки. Якщо значення switch-вираження не збігається ні з одним константным виразом, то виконується послідовність операторів гілки default, якщо ж такої гілки немає, то оператор switch еквівалентний порожньому оператору. Ще одна невдача у синтаксичній конструкції switch пов'язана з істотним обмеженням, що накладається на case-вирази, які можуть бути тільки константным виразом. Розбір випадків - це часта ситуація в самих різних завданнях. Застосовуючи оператор switch, пам'ятайте про недоліки його синтаксису, використовуйте його в правильному стилі. Закінчуйте кожну case-гілка оператором break. Коли розбір випадків передбачає перевірку попадання в деякий діапазон значень, доводиться вдаватися до оператору if для формування спеціальної змінної. Цей прийом демонструється в наступному прикладі, де йде робота над даними класу Testing: 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, дозволяє в подальшому використовувати розбір випадків в залежності від періоду життя: 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; } } Цей приклад демонструє коректний стиль використання оператора switch.
Переглядів: 4756 |