Г. Шилдт - Полный справочник по C# (1160789), страница 24
Текст из файла (страница 24)
Язык С#Как видите, несмотря на то, что этот цикл for спроектирован для перебора значений i в диапазоне от —10 до 10, инструкция break "досрочно" прекращает его выполнение, когда значение переменной i становится положительным.Инструкцию break можно использовать с любым С#-циклом, включая"бесконечный". Например, предыдущая программа, переделанная для использованияdo-while-цикла, имеет следующий вид:// Использование инструкции break для выхода/ / и з цикла do-while.using System;class BreakDemo2 {public s t a t i c void Main() {int i ;i = -10;do {i f ( i > 0) break;Console.Write(i + " " ) ;} while(i <= 10);Console.WriteLine("Готово!");Теперь рассмотрим более реальный пример.
Следующая программа находит наименьший множитель заданного числа.// Определение наименьшего множителя числа.using System;class FindSmallestFactor {public static void Main() {int factor = 1;int num = 1000;for(int i=2; i < num/2;if((num%i) == 0) {factor = i;break; // Цикл прекращается, когда найден множитель.Console.WriteLine("Наименьший множитель равен " + factor);Результаты выполнения этой программы выглядят так:1 Наименьший множитель равен 2Здесь инструкция break останавливает выполнение цикла for, как только находитмножитель числа. Тем самым предотвращается попытка опробовать любые другиезначения — кандидаты на "звание" множителя.При использовании внутри множества вложенных циклов инструкция break прерывает только самый внутренний цикл.Глава 5.
Инструкции управления121// Использование инструкции break с вложенными циклами,using System;class BreakNested {public static void Main() {for(int i=0; iConsole.WriteLine("Подсчет итераций внешнего цикла: " + i ) ;Console.Write(11Подсчет итераций внутреннего цикла: ") ;int t = 0;while(t < 100) {if(t == 10) break; // Останов цикла, когда// t равно 10.Console.Write(t + " " ) ;}Console.WriteLine();}Console.WriteLine("Циклы завершены.");Результаты работы этой программы выглядят следующимПодсчет итераций внешнего цикла: 0Подсчет итераций внутреннего цикла: 0 1 2 3Подсчет итераций внешнего цикла: 1Подсчет итераций внутреннего цикла: 0 1 2 3Подсчет итераций внешнего цикла: 2Подсчет итераций внутреннего цикла: 0 1 2 3Циклы завершены.образом:4 5 6 7 8 94 5 6 7 8 94 5 6 7 8 9Как видите, инструкция break, находящаяся во внутреннем цикле, прекращаетвыполнение только этого цикла, а на внешний не оказывает никакого воздействия.Хотелось бы также обратить ваше внимание на то, что в одном цикле можно использовать не одну, а несколько инструкций break, однако слишком большое их количество способно нарушить структуру кода.
И еще. Инструкция break, которая завершает выполнение инструкции switch, влияет только на инструкцию switch, а нена содержащий ее цикл.Использование ИНСТРУКЦИИ c o n t i n u eПомимо средства "досрочного" выхода из цикла, существует средство"досрочного" выхода из текущей его итерации. Этим средством является инструкцияc o n t i n u e . Она принудительно выполняет переход к следующей итерации, опускаявыполнение оставшегося кода в текущей. Инструкцию c o n t i n u e можно расцениватькак дополнение к более "радикальной" инструкции break.
Например, в следующейпрограмме используется инструкция c o n t i n u e для "ускоренного" поиска четных чисел в диапазоне от 0 до 100.II/Использование инструкции c o n t i n u e ,u s i n g System;122Часть I. Язык С#class ContDemo {public static void Main() {// Выводим четные числа между 0 и 100.for(int i = 0; i <= 100; i++) {if((i%2) != 0) continue; // Переход на следующую// итерацию.Console.WriteLine(i);Здесь выводятся только четные числа, поскольку при обнаружении нечетного числа происходит преждевременный переход к следующей итерации, а методWriteLine () не вызывается.В циклах while и do-while инструкция c o n t i n u e передает управление непосредственно инструкции, проверяющей условное выражение, после чего циклическийпроцесс продолжает "идти своим чередом".
А в цикле for после выполнения инструкции c o n t i n u e сначала вычисляется итерационное выражение, а затем — условное.И только после этого циклический процесс будет продолжен.Инструкция c o n t i n u e используется программистами не слишком часто, хотя внекоторых случаях он оказывается весьма кстати.ИНСТРУКЦИЯ r e t u r nИнструкция r e t u r n обеспечивает возврат из метода. Ее можно использовать длявозвращения методом значения. Подробнее см. главу 6.Инструкция g o t oИнструкция goto — это С#-инструкция безусловного перехода.
При ее выполнении управление программой передается инструкции, указанной с помощью метки.Долгие годы эта инструкция находилась в немилости у программистов, посколькуспособствовала, с их точки зрения, созданию "спагетти-кода". Однако инструкцияgoto по-прежнему используется, и иногда даже очень эффективно. В этой книге неделается попытка "реабилитации" законных прав этой инструкции в качестве однойиз форм управления программой. Более того, необходимо отметить, что в любой ситуации (в области программирования) можно обойтись без инструкции goto, поскольку она не является элементом, обеспечивающим полноту описания языка программирования. Вместе с тем в определенных ситуациях ее использование может бытьочень полезным. В этой книге было решено ограничить использование инструкцииgoto рамками этого раздела, так как, по мнению большинства программистов, онавносит в программу лишь беспорядок и делает ее практически нечитабельной.
Но поскольку использование инструкции goto в некоторых случаях может сделать намерение программиста яснее, ей стоит уделить некоторое внимание.Инструкция goto требует наличие в программе метки. Метка — это действительный в С# идентификатор, за которым поставлено двоеточие. Метка должна находиться в одном методе с инструкцией goto, которая ссылается на эту метку. Например, спомощью goto можно организовать следующий цикл на 100 итераций:х = 1;loopl:if(x< 100)goto loopl;Глава 5.
Инструкции управления123Инструкцию goto можно также использовать для перехода к case- или d e f a u l t ветви внутри инструкции switch. Ведь, по сути, case- и default-инструкции являются метками. Следовательно, они могут принимать "эстафету" управления, передаваемую инструкцией goto. Но в этом случае инструкция goto должна обязательнонаходиться в "рамках" той же инструкции switch.
Это значит, что с помощью какойлибо "внешней" инструкции goto нельзя попасть в инструкцию switch. Рассмотримпример, который иллюстрирует использование инструкций goto и switch.// Использование инструкций goto и s w i t c h .using System;class SwitchGoto {public static void Main() {for(int i=l; i < 5; i++)switch(i) {case 1:Console.WriteLine("Вgoto case 3;case 2:Console.WriteLine("Вgoto case 1;case 3:Console.WriteLine("Вgoto default;default:Console.WriteLine("Вbreak;{ветви case 1");ветви case 2 " ) ;ветви case 3 " ) ;ветви default");Console.WriteLine//goto case 1; // Ошибка! Нельзя впрыгнуть/ / в инструкцию s w i t c h .}Результаты выполнения этой программы выглядят так:В ветви case 1В ветви case 3В ветви defaultВВВВветвиветвиветвиветвиcase 2case 1case 3defaultВ ветви case 3В ветви defaultВ ветви defaultОбратите внимание на то, как используется инструкция goto для перехода к ветвям case и d e f a u l t инструкции switch.
Обратите также внимание на то, что caseпоследовательность инструкций не завершается инструкцией break. Поскольку gotoне позволяет case-последовательности "провалиться" в следующую case-последова124Часть I. Язык С#тельность, то специальное средство от "провала" (break) не требуется.
Как разъяснялось выше, инструкцию goto нельзя использовать для проникновения извне вswitch-конструкцию. Если удалить символы комментария в начале строкиI //goto case 1; // Ошибка!...,то программа не скомпилируется. Использование инструкции goto совместно синструкцией switch может быть полезно в особых случаях, но не рекомендуется какобщий стиль программирования.Иногда инструкцию goto стоит использовать для выхода из глубоко вложенныхинструкций.
Вот простой пример:// Демонстрация использования инструкции goto.using System;*class Use_goto {public s t a t i c void Main() {int i=0, j=0, k=0;for(i=0; i < 10;for(j=0; j < 10; j++ ) {for(k=0; k < 10; k++) {Consple.WriteLine("i, j , k: " + i + " " +j + " " + k) ;if(k == 3) goto stop;stop:Console.WriteLine("Все, хватит! i f j, k: " + i +", " + j + " " 4- k ) ;Результаты выполнения этой программы выглядят так:i,1,j ,k:0 О Ок: 00 00 21к: 0 0 3к:Все, хватит! i , j , к: 0, 0 3Для того чтобы получить такие же результаты, но без инструкции goto, пришлосьбы использовать три пары инструкций i f и break.
В данном случае инструкция gotoсущественно упрощает программный код. Несмотря на то что этот пример — совершенно искусственный, вы, вероятно, смогли представить ситуации, в которых применение инструкции goto может иметь преимущества перед другими вариантами.Глава 5. Инструкции управления125Полныйсправочник поВэтой главе вы познакомитесь с классом. В нем вся суть С#, поскольку именноклассом определяется природа объекта.
Это — фундамент, на котором построенязык С#. Класс как таковой формирует основу для объектно-ориентированного программирования в С#. Внутри класса определяются данные и код действий, выполняемых над этими данными. Этот код сосредоточен в методах. Получив представление оклассах, объектах и методах, вы сможете писать более сложные программы и лучшепонимать ключевые элементы С#, описанные в следующих главах.Введение в классыПоскольку все С#-профаммы оформляются в виде класса, мы работаем с классамис самого начала этой книги. Конечно же, мы использовали самые простые классы, спомощью которых нельзя продемонстрировать все их достоинства.
Как будет показано ниже, классы — это очень мощный инструмент, и вы еще сумеете оценить их богатые возможности.Итак, начнем с азов. Класс — это шаблон, который определяет форму объекта. Онзадает как данные, так и код, который оперирует этими данными. С# использует спецификацию класса для создания объекта.
Объекты — это экземпляры класса. Такимобразом, класс — это множество намерений (планов), определяющих, как долженбыть построен объект. Важно четко понимать следующее: класс — это логическая абстракция. О ее реализации нет смысла говорить до тех пор, пока не создан объекткласса, и в памяти не появилось физическое его представление.И еще. Вспомните, что методы и переменные, составляющие класс, называютсячленами класса.Общая форма определения классаОпределяя класс, вы определяете данные, которые он содержит, и код, манипулирующий этими данными.