Операторы выбора

Tip

Эта статья является частью раздела "Основы" для разработчиков , которые уже знают хотя бы один язык программирования и учат C#. Если вы не знакомы с программированием, сначала начните с учебных пособий по началу работы. Полный синтаксис см. в инструкциях выбора в справочнике по языку.

Вы пришли из другого языка? C++, Java и JavaScript во многом унаследовали C, поэтому if, else и switch в C# читаются одинаково. Стоит отметить одно различие: C# запрещает переход без `break` между непустыми вариантами switch, и каждая метка case может проверять шаблон, а не только константу. Если вы переходите с Python, то if/else if/else в C# соответствует if/elif/else, а основанный на шаблонах switch в C# ближе всего к оператору match в Python.

Операторы выбора определяют, какой блок кода будет выполняться на основе условия. C# предоставляет два варианта: if (с необязательным else) для ветвления по логическому значению и switch для сравнения одного значения с несколькими случаями. Логическое выражение — это любое выражение, которое принимает значение true или false, например выражение сравнения temperature >= 25.

Ветвь с if и else

Оператор if выполняет свой блок только тогда, когда его логическое выражение имеет значение true. else Добавьте блок для предоставления кода, выполняемого при условииfalse:

int temperature = 28;

// An if statement runs its block only when the condition is true.
// The else block runs when the condition is false.
if (temperature >= 25)
{
    Console.WriteLine("Warm"); // => Warm
}
else
{
    Console.WriteLine("Cool");
}

Тело if или else состоит из одного оператора, например присваивания или вызова метода. Блочная инструкция сама по себе является одной инструкцией, которая заключает в фигурные скобки ({ }) ноль или более инструкций.

Многие стандарты программирования рекомендуют заключать тела ветви в фигурные скобки даже для одной инструкции. Фигурные скобки явно задают область видимости. Это предотвращает распространённую ошибку: когда позже добавляют вторую строку, рассчитывая, что она будет выполняться условно, но вместо этого она выполняется безусловно. Только фигурные скобки определяют, какие инструкции относятся к ветке. C# не считает пробельные символы значимыми, поэтому сами по себе отступы тоже никогда не имеют значения. Фигурные скобки допустимы даже для одной строки: блок представляет собой единственную инструкцию, которую выполняет эта ветка. Используйте отступы в коде для удобочитаемости, но определяйте блок с помощью фигурных скобок.

Тестирование нескольких условий с помощью else if

Чтобы выбрать один из более чем двух путей, объедините условия с помощью else if. C# вычисляет каждое условие в порядке и запускает первый блок, условие которого равно true, а затем пропускает остальные. Последний else обрабатывает каждый оставшийся случай:

int score = 82;

// Chain conditions with else if. The first branch whose condition is
// true runs; the compiler skips the rest.
string grade;
if (score >= 90)
{
    grade = "A";
}
else if (score >= 80)
{
    grade = "B";
}
else if (score >= 70)
{
    grade = "C";
}
else
{
    grade = "F";
}

Console.WriteLine(grade); // => B

Порядок имеет значение в цепочке. Так как первое соответствующее условие выигрывает, поместите в первую очередь самые конкретные условия. В предыдущем примере проверка score >= 80 перед score >= 70 гарантирует, что оценка 82 будет сопоставлена с "B", а не с "C".

Сопоставить значение с помощью инструкции switch

Когда вы сравниваете одно значение со многими отдельными случаями, конструкция switch воспринимается понятнее, чем длинная цепочка else if. Подобно if, оператор switch является оператором ветвления: он определяет, какой код выполнять. Каждая case метка содержит значение, соответствующее, и каждый case раздел заканчивается оператором break . Сгруппируйте метки, чтобы они использовали один общий блок, и используйте раздел default для значений, которые не соответствуют ни одному варианту:

DayOfWeek day = DayOfWeek.Saturday;

// A switch statement compares one value against several case labels.
// Stacked labels share a body. Each section ends with break, and the
// default section runs when no case matches.
switch (day)
{
    case DayOfWeek.Saturday:
    case DayOfWeek.Sunday:
        Console.WriteLine("Weekend"); // => Weekend
        break;
    default:
        Console.WriteLine("Weekday");
        break;
}

В отличие от C и Java, C# не допускает перехода управления из одной непустой секции case в следующую. Каждый раздел, содержащий код, должен заканчиваться на break (или другим оператором перехода, например return или goto). Это правило предотвращает случайные ошибки, распространенные на этих языках.

Тестовые шаблоны с помощью case и when

Метка case не ограничивается константами. Он может протестировать шаблон, который является правилом, описывающим форму или значение данных. Реляционный шаблон, < 0 например соответствует любому значению меньше нуля. Добавьте конструкцию when, чтобы указать дополнительное условие, которое также должно быть true, чтобы случай совпал:

int measurement = 42;

// A case label can test a pattern instead of a constant. A when clause
// adds a condition that must also be true for the case to match.
switch (measurement)
{
    case < 0:
        Console.WriteLine("Negative");
        break;
    case 0:
        Console.WriteLine("Zero");
        break;
    case > 0 when measurement % 2 == 0:
        Console.WriteLine("Positive and even"); // => Positive and even
        break;
    default:
        Console.WriteLine("Positive and odd");
        break;
}

Варианты на основе шаблонов оцениваются сверху вниз, поэтому более конкретные шаблоны относятся к более общим. Полный каталог шаблонов см. в разделе "Сопоставление шаблонов".

Выбрать значение с помощью выражения

Операторы if и switch определяют, какой код выполняется. Если вместо этого нужно выбрать значение, используйте выражение. Выражение вычисляет значение, поэтому его можно использовать в любом месте, где ожидается значение, например справа от назначения или аргумента метода. C# предлагает формы выражений, которые выбирают значение из альтернативных вариантов, таких как условный оператор и switch выражение.

Условный оператор ?:

Условный оператор ?: выбирает одно из двух значений на основе логического условия.

О его синтаксисе, поведении при коротком замыкании и рекомендациях по его выбору вместо if/else см. в разделе Условный оператор ?:.

выражение switch

Выражение switch — это эквивалент инструкции switch в форме выражения. Вместо выполнения кода для соответствующего случая он вычисляет значение. Это короче, чем присваивать значение в каждой ветви инструкции switch, и компилятор предупреждает, если ветви не охватывают все возможные входные значения. Выражение switch является основной частью сопоставления шаблонов. Чтобы узнать, когда и как использовать его, см. сопоставление шаблонов и ссылку switch на выражение .

См. также