русс | укр

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






© 2012 ci-sharp.ru При використанні матеріалу пряме iндексуюче посилання на сайт ОБОВ'ЯЗКОВЕ.
Права строго захищені нормами міжнародного права, інтелектуальної власності та авторського права.