Содержание
Функции состоят из инструкций, которые исполняются последовательно в порядке следования в исходном коде. Блок инструкций (statement block) набор инструкций, заключенных в фигурные скобки { }.
Декларативные инструкции (Declaration Statements)
Декларативные инструкции объявляют новые переменные, а также могут присваивать им значение (инициализировать) какого-либо выражения. Декларативные инструкции завершаются точкой с запятой. В одной декларативной инструкции можно объявить несколько переменных одного и того же типа, разделив их запятыми.
1 | bool rich = true, famous = false; |
Объявление констант происходит также как объявление переменных, за исключением того, что при объявлении константе обязательно должно быть присвоено значение, и это значение потом не может быть изменено.
1 | const double c = 2.99792458E08; |
Область видимости локальных переменных (и локальных констант) ограничивается блоком, в котором они объявлены. В пределах одного блока и вложенных в него блоков нельзя объявить несколько переменных с одинаковыми именами.
Инструкции выражения (Expression Statements)
Инструкции выражения — это выражения, являющиеся валидными инструкциями, т.е. выражения, которые делают что-либо:
- присваивают или изменяют значение переменной
- создают экземпляр объекта
- вызывают метод
Остальные выражения считаются невалидными инструкциями:
1 2 | string s = "foo"; s.Length; // Невалидная инструкция - ничего не делает |
Вызывая конструктор или метод, которые возвращают значение, использовать результат не обязательно. Однако если конструктор или метод никак иначе не влияют на программу, инструкция является бесполезной.
1 2 | new StringBuilder(); // Валидная, но бесполезная инструкция x.Equals (y); // Валидная, но бесполезная инструкция |
Инструкции выбора (Selection Statements)
Инструкции выбора изменяю поток выполнения программы в зависимости от определенных условий.
Инструкция if
Инструкция if
выполняет другую инструкцию или блок инструкций если логическое выражение возвращает true
:
1 2 3 4 5 6 7 | if (5 < 2 * 3) Console.WriteLine ("true"); // true if (5 < 2 * 3) { Console.WriteLine ("true"); // true Console.WriteLine ("...") } |
Инструкция if
может дополняться оговоркой else
, выполняемой если логическое выражение вернет false
:
1 2 3 4 | if (2 + 2 == 5) Console.WriteLine ("Does not compute"); else Console.WriteLine ("False"); // False |
Внутри оговорки else может быть вложена еще одна инструкция if:
1 2 3 4 5 | if (2 + 2 == 5) Console.WriteLine ("Does not compute"); else if (2 + 2 == 4) Console.WriteLine ("Computes"); |
Оговорка else всегда относится к первой предшествующей ей инструкции if. Например, два следующих примера полностью идентичны:
1 2 3 4 5 6 7 8 9 10 11 12 13 | if (true) if (false) Console.WriteLine(); else Console.WriteLine ("executes"); // идентично: if (true) { if (false) Console.WriteLine(); else Console.WriteLine ("executes"); } |
Однако это порядок можно изменить с помощью фигурных скобок:
1 2 3 4 5 6 7 | if (true) { if (false) Console.WriteLine(); } else Console.WriteLine ("does not execute"); |
В C# нет ключевого слова elseif
, но оно успешно заменяется сочетанием else if
:
1 2 3 4 5 6 7 8 9 10 11 | static void TellMeWhatICanDo (int age) { if (age >= 35) Console.WriteLine ("You can be president!"); else if (age >= 21) Console.WriteLine ("You can drink!"); else if (age >= 18) Console.WriteLine ("You can vote!"); else Console.WriteLine ("You can wait!"); } |
Инструкция switch
Инструкция switch
позволяет выбрать вариант выполнения программы основываясь на выборе одного из возможных значений переменной. Инструкция switch
более производительна, чем несколько инструкций if
, поскольку в ней выражение, на основании которого осуществляется выбор, вычисляется один раз.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | static void ShowCard (int cardNumber) { switch (cardNumber) { case 13: Console.WriteLine ("King"); break; case 12: Console.WriteLine ("Queen"); break; case 11: Console.WriteLine ("Jack"); break; default: // Любой другой вариант Console.WriteLine (cardNumber); break; } } |
В инструкции switch
может использоваться выражение, возвращающее только типы string
, предопределенные целочисленные типы, тип enum
и их nullable
варианты.
В конце каждого case
варианта необходимо явно указать, куда должно идти выполнение программы дальше. Для этого может быть использована одна из инструкций перехода (jump statement):
break
— переходит в конец инструкции switchgoto case x
— переход к другому варианту casegoto default
— переход к варианту default- любая друга инструкция перехода, например,
return
,throw
,continue
илиgoto label
Если один и тот же код должен быть выполнен в нескольких вариантах case
, их можно перечислить подряд:
1 2 3 4 5 6 7 8 9 10 11 | switch (cardNumber) { case 13: case 12: case 11: Console.WriteLine ("Face card"); break; default: Console.WriteLine ("Plain card"); break; } |
Эта особенность инструкции switch
также делает ее более удобной в использовании чем несколько инструкций if-else
.
Инструкции повторения (Iteration Statements)
К инструкциям повторения относятся инструкции while
, do-while
, for
, и foreach
.
Циклы while и do-while
Цикл while
повторяет блок инструкций пока логическое выражение верно (true
). Выражение вычисляется до выполнения блока инструкций.
1 2 3 4 5 | int i = 0; while (i < 3) { Console.Write (i++); } |
Цикл do-while
отличается от цикла while
только тем, что логическое выражение вычисляется после выполнения блока инструкций (тем самым обеспечивая хотя бы одно выполнение блока).
1 2 3 4 5 6 | int i = 0; do { Console.WriteLine (i++); } while (i < 3); |
Цикл for
Цикл for
похож на цикл while
, но при этом он содержит ряд специальных условий для инициализации и интерации (повтора) переменной цикла (переменная, управляющая циклом). Точнее цикл for
содержит три таких условия:
1 2 | for (инициализация - init-clause; условие - condition-clause; повтор - iteration-clause) инструкция или блок инструкций |
Инициализация (init-clause) выполняется до цикла и обычно инициализирует одну или несколько переменных цикла. Условие (condition-clause) — логическое выражение, которое вычисляется перед каждым повтором (интерацией) цикла. Тело цикла выполняется до тех пор, пока это выражение истинно (true). Повтор или интерация (iteration-clause) выполняется после каждого повтора (интерации) цикла. В нем переменная цикла как правило обновляется.
1 2 | for (int i = 0; i < 3; i++) Console.WriteLine (i); |
1 2 3 4 5 6 | for (int i = 0, prevFib = 1, curFib = 1; i < 10; i++) { Console.WriteLine (prevFib); int newFib = prevFib + curFib; prevFib = curFib; curFib = newFib; } |
Каждое из трех условий может быть опущено:
1 | for (;;) Console.WriteLine ("interrupt me"); // Бесконечный цикл |
Цикл foreach
Инструкция foreach повторяет каждый элемент перечисляемого объекта. Большинство типов в C#, представляющих набор элементов, являются перечисляемыми (например, массив и строка).
1 2 | foreach (char c in "beer") Console.WriteLine (c + " "); // b e e r |
Инструкции перехода
К инструкция перехода относятся break
, continue
, goto
, return
, и throw
.
Инструкция break
прекращает выполнение цикла или инструкции switch
1 2 3 4 5 6 7 | int x = 0; while (true) { if (x++ > 5) break; } // выполнение продолжается здесь ... |
continue
прекращает выполнение очередного повтора (интерации) в цикле и переходит к следующему.1 2 3 4 5 | for (int i = 0; i < 10; i++) { if ((i % 2) == 0) continue; Console.Write (i + " "); // 1 3 5 7 9 } |
goto
переносит выполнение к указанной метке в пределах блока инструкций:1 2 3 4 5 6 7 8 | int i = 1; startLoop: if (i <= 5) { Console.Write (i + " "); // 1 2 3 4 5 i++; goto startLoop; } |
return
выходит из метода и возвращает значение определенного типа (если метод возвращает значение). Инструкция return
может использоваться в любом месте метода.1 2 3 4 5 | static decimal AsPercentage (decimal d) { decimal p = d * 100m; return p; } |