Выбрать главу

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

Когда разбор случаев предполагает проверку попадания в некоторый диапазон значений, приходится прибегать к оператору 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;

}

Этот пример демонстрирует применение ветвящегося оператора 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">операция над аргументами</ра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" и о том, как можно обойтись без него, писал еще Эдгар Дейкстра при обосновании принципов структурного программирования.