Условия, циклы и методы в C#
Управление ходом программы — это три вопроса: какой код выполнить (условия и switch), сколько раз (циклы) и как разбить работу на именованные части (методы). Синтаксис C# здесь похож на C, Java и JavaScript, поэтому ошибки возникают как раз там, где правила расходятся.
Специфика C#, на которой спотыкаются: условие — только bool, и if (x = 0) не скомпилируется; инструкция switch не позволяет секции молча перейти в следующую, а switch-выражение возвращает значение и бросает исключение, если ни одна ветвь не подошла; переменную foreach нельзя присвоить; break и continue действуют на один уровень и не знают меток; функции среди инструкций верхнего уровня — локальные, и перегружать их нельзя. Разбор по слоям — ниже.
Карта темы
- Условия —
if/else if/else, блоки и ловушка лишней;, тернарный оператор?:, основыswitch-выражения. - Инструкция switch —
case,breakиdefault, запрет неявного перехода (CS0163), несколько меток на секцию,goto case,switchпо строкам. - Циклы —
while,do/while,for,foreach, бесконечные циклы, переменная итерации только для чтения (CS1656), ошибка на единицу. - break и continue — досрочный выход и пропуск итерации, вложенные циклы, выход из обоих циклов через
return. - Методы — локальные функции против методов класса, параметры и аргументы,
returnиvoid, необязательные и именованные аргументы,ref/out/in, рекурсия.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Писать if (count) или if (x = 0) | Ошибка CS0029: условие обязано быть bool, число и присваивание не подходят |
Ставить ; после if (…) | Тело становится пустой инструкцией, а следующий блок выполняется всегда; компилятор лишь предупреждает CS0642 |
Забыть break в секции switch | Ошибка CS0163: неявного перехода в следующую секцию в C# нет |
Ждать, что break в switch выйдет из цикла | break завершает только switch, цикл продолжается |
Присваивать переменной foreach | Ошибка CS1656: она только для чтения; менять элементы нужно через индекс в for |
Удалять элементы List<T> внутри foreach | InvalidOperationException: коллекцию нельзя менять во время перечисления |
Ставить continue в while до шага | Шаг не выполняется, и цикл крутится вечно |
Ждать, что метод изменит переданный int | Аргумент передаётся по значению; изменить переменную вызывающего можно только через ref или out |
Значение для собеседований
На собеседовании эти темы звучат как задачи: пройти массив, найти элемент, посчитать результат вложенных циклов, объяснить вывод switch. Интервьюер смотрит, пишете ли вы границы цикла без ошибки на единицу и знаете ли правила C#, которые отличают его от C и Java.
Что обычно проверяют:
- Разницу
whileиdo/while,forиforeach, и когда какой брать. - Почему в C# нет неявного перехода между секциями
switchи как сгруппировать метки. - Чем инструкция
switchотличается отswitch-выражения. - Как выйти из двух вложенных циклов сразу.
- Разницу передачи по значению,
refиout, и зачемoutвint.TryParse. - Что такое необязательные и именованные аргументы и чем опасна рекурсия без базового случая.
Типичный неверный ответ: «break внутри switch прервёт цикл, в котором стоит switch». Это открывает разговор о том, что break действует на ближайшую охватывающую конструкцию — сам switch, — и выйти из цикла можно только через return, флаг или goto, потому что меток у break в C# нет.