Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
Когда разбор случаев предполагает проверку попадания в некоторый диапазон значений, приходится прибегать к оператору if дня формирования специальной переменной. Этот прием демонстрируется в следующем примере, где идет работа надданными нашего класса Testing:
/// <summary>
/// Определяет период в зависимости от возраста — аge
/// Использование ветвящегося оператора 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;
}
Этот
/// <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">операция над аргументами</раram>
/// <param name="arg1">первый аргумент бинарной операции</param>
/// <param name="arg2">второй аргумент бинарной операции</param>
/// <param name="result">результат бинарной операции</param>
public void ExprResult(string operation,int argl, 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
Операторы перехода
Операторов перехода, позволяющих прервать естественный порядок выполнения операторов блока, в языке C# имеется несколько.
Оператор goto
Оператор goto имеет простой синтаксис и семантику:
goto [метка] case константное_выражение|default];
Все операторы языка C# могут иметь метку — уникальный идентификатор, предшествующий оператору отделенный от него символом двоеточия. Передача управления помеченному оператору — это классическое использование оператора goto. Два других способа использования goto (передача управления в case или default– ветвь) используются в операторе switch, о чем шла речь выше.
"О вреде оператора goto" и о том, как можно обойтись без него, писал еще Эдгар Дейкстра при обосновании принципов структурного программирования.
Я уже многие годы не применяю этот оператор и считаю, что хороший стиль программирования не предполагает использования этого оператора в C# ни в каком из вариантов — ни в операторе switch, ни для организации безусловных переходов.
Операторы break и continue
В структурном программировании признаются полезными "переходы вперед" (но не назад), позволяющие при выполнении некоторого условия выйти из цикла, из оператора выбора, из блока. Для этой цели можно использовать оператор goto, но лучше применять специально предназначенные для этих целей операторы break и continue.
Оператор break может стоять в теле цикла или завершать case-ветвь в операторе switch. Пример его использования в операторе switch уже демонстрировался. При выполнении оператора break в теле цикла завершается выполнение самого внутреннего цикла. В теле цикла, чаще всего, оператор break помещается в одну из ветвей оператора if, проверяющего условие преждевременного завершения цикла: