1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 24
Текст из файла (страница 24)
Вместе с тем вопределенных ситуациях ее использование может быть очень полезным. В этой книге былорешено ограничить использование инструкции goto рамками этого раздела, так как, помнению большинства программистов, она вносит в программу лишь беспорядок и делает еепрактически нечитабельной. Но поскольку использование инструкции goto в некоторыхслучаях может сделать намерение программиста яснее, ей стоит уделить некотороевнимание.Инструкция goto требует наличие в программе метки. Метка — это действительныйв C# идентификатор, за которым поставлено двоеточие.
Метка должна находиться в одномметоде с инструкцией goto, которая ссылается на эту метку. Например, с помощью gotoможно организовать следующий цикл на 100 итераций:x = 1;loop1:x++;if(x < 100) goto loop1;Глава 5. Инструкции управления123Инструкцию goto можно также использовать для перехода к case- или defaultветви внутри инструкции switch. Ведь, по сути, case- и default-инструкции являютсяметками.
Следовательно, они могут принимать “эстафету” управления, передаваемуюинструкцией goto. Но в этом случае инструкция goto должна обязательно находиться в“рамках” той же инструкции switch. Это значит, что с помощью какой-либо “внешней”инструкции goto нельзя попасть в инструкцию switch. Рассмотрим пример, которыйиллюстрирует использование инструкций goto и switch.// Использование инструкций goto и switch.using System;class SwitchGoto {public 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 2case 1case 3defaultВ ветви case 3В ветви defaultВ ветви defaultОбратите внимание на то, как используется инструкция goto для перехода к ветвямcase и default инструкции switch.
Обратите также внимание на то, что caseпоследовательность инструкций не завершается инструкцией break. Поскольку goto непозволяетcase-последовательности“провалиться”вследующуюcaseпоследовательность,124Часть I. Язык C#то специальное средство от “провала” (break) не требуется. Как разъяснялось выше,инструкцию goto нельзя использовать для проникновения извне в switch-конструкцию.Если удалить символы комментария в начале строки// goto case 1; // Ошибка!...то программа не скомпилируется. Использование инструкции goto совместно синструкцией switch может быть полезно в особых случаях, но не рекомендуется какобщий стиль программирования,Иногда инструкцию goto стоит использовать для выхода из глубоко вложенныхинструкций.
Вот простой пример:// Демонстрация использования инструкции goto.using System;class Use_goto {public 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 0i, j, k; 0 0 1i, j, k: 0 0 2i, j, k: 0 0 3Все, хватит! i, j, k: 0, 0, 3Для того чтобы получить такие же результаты, но без инструкции goto, пришлосьбы использовать три пары инструкций if и break. В данном случае инструкция gotoсущественно упрощает программный код. Несмотря на то что этот пример — совершенноискусственный, вы, вероятно, смогли представить ситуации, в которых применениеинструкции goto может иметь преимущества перед другими вариантами.Глава 5.
Инструкции управления125Полныйсправочник поГлава 6Введение в классы,объекты и методыВэтой главе вы познакомитесь с классом. В нем вся суть C#, поскольку именно классомопределяется природа объекта. Это — фундамент, на котором построен язык C#.Класс как таковой формирует основу для объектно-ориентированного программирования вC#. Внутри класса определяются данные и код действий, выполняемых над этими данными.Этот код сосредоточен в методах.
Получив представление о классах, объектах и методах,вы сможете писать более сложные программы и лучше понимать ключевые элементы C#,описанные в следующих главах.Введение в классыПоскольку все C#-программы оформляются в виде класса, мы работаем с классами ссамого начала этой книги.
Конечно же, мы использовали самые простые классы, с помощьюкоторых нельзя продемонстрировать все их достоинства. Как будет показано ниже, классы— это очень мощный инструмент, и вы еще сумеете оценить их богатые возможности.Итак, начнем с азов. Класс — это шаблон, который определяет форму объекта. Онзадает как данные, так и код, который оперирует этими данными. C# используетспецификацию класса для создания объекта. Объекты — это экземпляры класса. Такимобразом, класс — это множество намерений (планов), определяющих, как должен бытьпостроен объект. Важно четко понимать следующее: класс — это логическая абстракция.
Оее реализации нет смысла говорить до тех пор, пока не создан объект класса, и в памяти непоявилось физическое его представление.И еще. Вспомните, что методы и переменные, составляющие класс, называютсячленами класса.Общая форма определения классаОпределяя класс, вы определяете данные, которые он содержит, и код,манипулирующий этими данными. Несмотря на то что очень простые классы могутвключать только код или только данные, большинство реальных классов содержат и то, идругое.Данные содержатся в переменных экземпляров, определяемых классом, а код — вметодах.
Однако важно с самого начала отметить, что класс определяет также рядспециальных членов данных и методов-членов, например статические переменные,константы, конструкторы, деструкторы, индексаторы, события, операторы и свойства. Покамы ограничимся рассмотрением переменных экземпляров и методов класса, а к концу главыпознакомимся с конструкторами и деструкторами. Остальные типы членов класса описаныв последующих главах.Класс создается с помощью ключевого слова class. Общая форма определениякласса, который содержит только переменные экземпляров и методы, имеет следующийвид:class имя_класса {// Объявление переменных экземпляров.доступ тип переменная1;доступ тип переменная2;//...доступ тип переменнаяN;// Объявление методов.доступ тип_возврата метод1(параметры) {// тело метода}Глава 6.
Введение в классы, объекты и методы127доступ тип_возврата метод2(параметры) {// тело метода}доступ тип_возврата методN(параметры) {// тело метода}}Обратите внимание на то, что объявление каждой переменной и каждого методапредваряется элементом доступ. Здесь элемент доступ означает спецификатор доступа(например, public), который определяет, как к этому члену можно получить доступ. Какупоминалось в главе 2, члены класса могут быть закрытыми в рамках класса или болеедоступными.
Спецификатор доступа определяет, какой именно разрешен тип доступа.Спецификатор доступа необязателен, и, если он не указан, подразумевается, что этот члензакрыт (private). Члены с закрытым доступом (закрытые члены) могут использоватьсятолько другими членами своего класса. В примерах этой главы все члены классовопределяются как public-члены, а это значит, что их могут использовать все остальныесоставные части программного кода, даже те, которые определены вне класса. Крассмотрению спецификаторов доступа мы вернемся в главе 8.Несмотря на отсутствие специального синтаксического правила определения класса(его качественного и количественного состава), все же считается, что класс долженопределять только одну логическую сущность.
Например, класс, в котором хранятся именалиц и их телефонные номера, не должен (по общепринятым меркам) также содержатьинформацию о среднем количестве осадков, циклах возникновения пятен на Солнце ипрочую не связанную с конкретными лицами информацию. Другими словами, правильноопределенный класс должен содержать логически связанные данные. И наоборот, помещаяв один класс логически несвязанные данные, вы рискуете деструктурировать свой код.Классы, которые мы использовали в этой книге до сих пор, содержали только одинметод — Main(). Вскоре мы узнаем, как создавать и другие методы. Однако заметьте, чтов общей форме определения класса метод Main() не задан. Он нужен только в том случае,если определяемый класс является отправной точкой программы.Определение классаДля иллюстрации мы создадим класс, который инкапсулирует информацию о зданиях(домах, складских помещениях, офисах и пр.).