Поток управления в C#

Подобно С, С++ и Java, язык С# включает обычный набор структур, управляющих потоком управления. В С# реализован даже такой непопулярный оператор, как goto.

if-else, while, do-while и for

Конструкция if-else в C# идентична той же конструкции в С++ и Java. В качестве рекомендации по стилю: в операторах if предпочтительней всегда использовать блоки, как и в любых других операторах управления потоком, даже если эти блоки содержат всего один оператор, как в примере ниже:

1
2
3
if( <test condition> )  {
Console.WriteLine( "Выполнение находится в этой точке." );
}

Операторы while, do и for идентичны доступным в языках С++ и Java.

switch

Синтаксис оператора switch в С# очень похож на синтаксис switch в С++ и Java. Основное отличие состоит в том, что switch в С# не допускает прохода в следующий раздел. Он требует наличия в конце каждого раздела оператора break (или другой передачи управления). В целом это отличное требование.

В С++ и Java присутствует масса трудно обнаруживаемых ошибок, которые являются следствием того, что разработчики забывают вставить оператор break или меняют порядок разделов внутри switch, когда один из них позволяет проходить потоку управления в другой.

В С# компилятор немедленно сообщит об ошибке, если обнаружит проход из одного раздела в следующий. Единственное исключение из этого правила состоит в том, что можно иметь несколько меток (используя ключевое слово case) на один раздел switch, как показано в следующем фрагменте кода. Кроме того, можно эмулировать прохождение сквозь раздел с помощью оператора goto:

1
2
3
4
5
6
7
8
switch ( к )  {
case 0:
Console.WriteLine ( "case 0" );
goto case 1;
case 1:
case 2:
Console.WriteLine ( "case 1 или case 2" );
break;

Использование оператора goto обычно считается дурным тоном в программировании, поскольку, помимо прочего, порождает код, который очень трудно сопровождать. Наличие этого оператора в языке отнюдь не означает возможность его бесконтрольного использования. Вообще говоря, случаи, когда оператор goto необходим, чрезвычайно редки.

Всякий раз, когда обнаруживается, что можно применить goto, рекомендуется пересмотреть дизайн и проверить, не покрывает ли оператор goto некоторый изъян в дизайне.

Обратите внимание, что в конце каждого раздела имеется некоторая форма оператора перехода. Даже последний раздел должен содержать его. Многие разработчики С++ и Java пропускают оператор break в последнем разделе, поскольку после него все равно происходит выход потока управления за пределы switch.

Изящество принципа “никаких сквозных проходов” состоит в том, что даже если разработчик, сопровождающий код, впоследствии решит поменять местами порядок меток, он не привнесет никаких ошибок, в отличие от С++ и Java.

Обычно для завершения разделов switch используется оператор break, но для выхода из этого раздела можно применять любой оператор, в том числе throw и return, а также continue, если switch встроен в цикл, в котором применение continue имеет смысл.

foreach

Оператор foreach позволяет выполнять итерацию по коллекции объектов в синтаксически естественной манере. Следует отметить, что ту же функциональность можно реализовать с использованием цикла while. Однако это может выглядеть некрасиво, к тому же итерация по элементам коллекции — настолько распространенная задача, что синтаксис foreach является полезным дополнением к языку.

Если, например, имеется массив (или коллекция любого другого типа) строк, то пройти по всем строкам можно с помощью следующего кода:

1
2
3
4
5
6
7
static void Main()  {
string[] strings = new string[5];
strings[0] = "Bob";
strings [1] = "Joe";
foreach( string item in strings )  {
Console.WriteLine ( "{0}", item );
}

Внутри скобок цикла foreach можно объявить тип переменной итератора. В данном примере это строка. За объявлением типа итератора идет идентификатор коллекции, по которой нужно выполнить итерацию. Здесь может использоваться любой объект, реализующий шаблон Collection (Коллекция).

Естественно, элементы внутри коллекции, используемые в операторе foreach, должны быть явно преобразуемыми к типу итератора. Если это не так, то оператор foreach сгенерирует исключение InvalidCastException во время выполнения. Если хотите испытать это на собственном опыте, попробуйте запустить следующую модификацию предыдущего примера:

1
2
3
4
5
6
7
static void Main()  {
object[] strings = new object[5];
strings[0] = 1;
strings[1] = 2;
foreach ( string item in strings )  {
Console.WriteLine ( "{0}", item );
}

Обратите внимание, что в коде, вставленном в оператор foreach, не допускается модификация переменной итератора. Она должна трактоваться как доступная только для чтения. Это означает, что переменную итератора нельзя передавать методу в качестве выходного (out) или ссылочного (ref) параметра. Если вы попытаетесь сделать что-либо подобное, то компилятор немедленно сообщит об ошибке.

break, continue, goto, return и throw

Язык C# включает набор знакомых операторов, которые позволяют безусловно передавать управление в другое место кода. К ним относятся break, continue, goto, return и throw. Их синтаксис должен быть знаком любому разработчику С++ или Java (хотя оператор goto в Java отсутствует). Применение эти операторов, по сути, идентично во всех трех языках.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100