Полное руководство. С# 4.0
Шрифт:
Оператор break прерывает выполнение цикла for, как только будет выявлен наи меньший множитель числа. Благодаря такому применению оператора break исклю чается опробование любых других значений после выявления наименьшего множите ля числа, а следовательно, и неэффективное выполнение кода.
Если оператор break применяется в целом ряде вложенных циклов, то он преры вает выполнение только самого внутреннего цикла. В качестве примера рассмотрим следующую программу. // Применить оператор break во вложенных циклах. using System; class BreakNested { static void Main { for(int i=0; i<3; i++) { Console.WriteLine("Подсчет во внешнем цикле: " + i); Console.Write(" Подсчет во внутреннем цикле: "); int t = 0; while(t < 100) { if(t == 10) break; // прервать цикл, если t равно 10 Console.Write(t + " "); t++; } Console.WriteLine; } Console.WriteLine("Циклы
Выполнение этой программы дает следующий результат. Подсчет во внешнем цикле: 0 Подсчет во внутреннем цикле: 0 1 2 3 4 5 6 7 8 9 Подсчет во внешнем цикле: 1 Подсчет во внутреннем цикле: 0 1 2 3 4 5 6 1 8 9 Подсчет во внешнем цикле: 2 Подсчет во внутреннем цикле: 0 1 2 3 4 5 6 1 8 9 Циклы завершены
Как видите, оператор break из внутреннего цикла вызывает прерывание только этого цикла, а на выполнение внешнего цикла он не оказывает никакого влияния.
В отношении оператора break необходимо также иметь в виду следующее. Во- первых, в теле цикле может присутствовать несколько операторов break, но приме нять их следует очень аккуратно, поскольку чрезмерное количество операторов break обычно приводит к нарушению нормальной структуры кода. И во-вторых, оператор break, выполняющий выход из оператора switch, оказывает воздействие только на этот оператор, но не на объемлющие его циклы. Применение оператора continue
С помощью оператора continue можно организовать преждевременное заверше ние шага итерации цикла в обход обычной структуры управления циклом. Оператор continue осуществляет принудительный переход к следующему шагу цикла, пропу ская любой код, оставшийся невыполненным. Таким образом, оператор continue слу жит своего рода дополнением оператора break. В приведенном ниже примере про граммы оператор continue используется в качестве вспомогательного средства для вывода четных чисел в пределах от 0 до 100. // Применить оператор continue. using System; class ContDemo { static void Main { // вывести четные числа от 0 до 100. for (int i = 0; i <= 100; i++) { if((i%2) != 0) continue; // перейти к следующему шагу итерации Console.WriteLine(i); } } }
В данном примере выводятся только четные числа, поскольку при обнаружении нечетного числа шаг итерации цикла завершается преждевременно в обход вызова ме тода WriteLine.
В циклах while и do-while оператор continue вызывает передачу управления не посредственно условному выражению, после чего продолжается процесс выполнения цикла. А в цикле for сначала вычисляется итерационное выражение, затем условное выражение, после чего цикл продолжается.
Оператор continue редко находит удачное применение, в частности, потому, что в C# предоставляется богатый набор операторов цикла, удовлетворяющих большую часть прикладных потребностей. Но в тех особых случаях, когда требуется преждевре менное прерывание шага итерации цикла, оператор continue предоставляет струк турированный способ осуществления такого прерывания. Оператор return
Оператор return организует возврат из метода. Его можно также использовать для возврата значения. Более подробно он рассматривается в главе 6. Оператор goto
Имеющийся в C# оператор goto представляет собой оператор безусловного пере хода. Когда в программе встречается оператор goto, ее выполнение переходит непо средственно к тому месту, на которое указывает этот оператор. Он уже давно "вышел из употребления" в программировании, поскольку способствует созданию "макарон ного" кода. Тем не менее оператор goto все еще находит применение — иногда даже эффективное. В этой книге не делается никаких далеко идущих выводов относительно правомочности использования оператора goto для управления программой. Следует, однако, подчеркнуть, что этому оператору трудно найти полезное применение, и поэ тому он не особенно нужен для полноты языка программирования. Хотя в некоторых случаях он оказывается удобным и дает определенные преимущества, если использу ется благоразумно. В силу этих причин оператор goto упоминается только в данном разделе книги. Главный недостаток оператора goto с точки зрения программирования заключается в том, что он вносит в программу беспорядок и делает ее практически неудобочитаемой. Но иногда применение оператора goto может, скорее, прояснить, чем запутать ход выполнения программы.
Для выполнения оператора goto требуется метка — действительный в С# иден тификатор с двоеточием. Метка должна находиться в том же методе, где и оператор goto, а также в пределах той же самой области действия. В приведенном ниже при мере программы цикл суммирования чисел от 1 до 100 организован с помощью опе ратора goto и соответствующей метки. х = 1; loop1: х++; if(x < 100) goto loop1;
Кроме того, оператор goto может быть использован для безусловного перехода к ветви case или default в операторе switch. Формально ветви case или default выполняют в операторе switch роль меток. Поэтому они могут служить адресатами оператора goto. Тем не менее оператор goto должен выполняться в пределах опе ратора switch. Это означает, что его нельзя использовать как внешнее средство для безусловного перехода в оператор switch. В приведенном ниже примере программы демонстрируется применение оператора goto в операторе switch. // Применить оператор goto в операторе switch. using System; class SwitchGoto { static void Main { for(int i=1; i < 5; i++) { switch(i) { case 1: Console.WriteLine("В ветви case 1"); goto case 3; case 2 : Console.WriteLine("В ветви case 2"); goto case 1; case 3: Console.WriteLine("В ветви case 3"); goto default; default: Console.WriteLine("В ветви default"); break; } Console.WriteLine; } // goto case 1; // Ошибка! Безусловный переход к оператору switch недопустим. } }
Вот к какому результату приводит выполнение этой программы. В ветви case 1 В ветви case 3 В ветви default В ветви case 2 В ветви case 1 В ветви case 3 В ветви default В ветви case 3 В ветви default В ветви default
Обратите внимание на то, как оператор goto используется в операторе switch для перехода к другим его ветвям case иди к ветви default. Обратите также внимание на то, что ветви case не оканчиваются оператором break. Благодаря тому что опе ратор goto препятствует последовательному переходу от одной ветви case к другой, упоминавшееся ранее правило недопущения "провалов" не нарушается, а следова тельно, необходимость в применении оператора break в данном случае отпадает. Но как пояснялось выше, оператор goto нельзя использовать как внешнее средство для безусловного перехода к оператору switch. Так, если удалить символы комментария в начале следующей строки: // goto case 1; // Ошибка! Безусловный переход к оператору switch недопустим.
приведенная выше программа не будет скомпилирована. Откровенно говоря, при менение оператора goto в операторе switch, в общем, не рекомендуется как стиль программирования, хотя в ряде особых случаев это может принести определенную пользу.
Ниже приведен один из полезных примеров применения оператора goto для выхода из глубоко вложенной части программы. // Продемонстрировать практическое применение оператора goto. using System; class Use_goto { static void Main { int i=0, j=0, k=0; for(i=0; i < 10; i++) { for(j=0; j < 10; j++ ) { for(k=0; k < 10; k++) { Console.WriteLine("i, j, k: " + i + " " + j + " " + k); if(k == 3) goto stop; } } } stop: Console.WriteLine("Остановлено! i, j, k: " + i + ", " + j + " " + k); } }
Выполнение этой программы дает следующий результат. i, j, k: 0 0 0 i, j, k: 0 0 1 i, j, k: 0 0 2 i, j, k: 0 0 3 Остановлено! i, j, k: 0, 0 3
Если бы не оператор goto, то в приведенной выше программе пришлось бы при бегнуть к трем операторам if и break, чтобы выйти из глубоко вложенной части этой программы. В данном случае оператор goto действительно упрощает код. И хотя при веденный выше пример служит лишь для демонстрации применения оператора goto, вполне возможны ситуации, в которых этот оператор может на самом деле оказаться полезным.
И последнее замечание: как следует из приведенного выше примера, из кодового блока можно выйти непосредственно, но войти в него так же непосредственно нельзя.
ГЛАВА 6. Введение в классы, объекты и методы
Эта глава служит введением в классы. Класс составляет основу языка С#, поскольку он определяет характер объекта. Кроме того, класс служит основанием для объектно-ориентированного программирования (ООП). В пределах класса определяются данные и код. А посколь ку классы и объекты относятся к основополагающим эле ментам С#, то для их рассмотрения требуется не одна глава книги. В данной главе рассмотрение классов и объектов на чинается с их главных особенностей. Основные положения о классах