Добавить в цитаты Настройки чтения

Страница 29 из 188

приведенная выше программа не будет скомпилирована. Откровенно говоря, применение оператора 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 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,вполне возможны ситуации, в которых этот оператор может на самом деле оказатьсяполезным.

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

ГЛАВА 6. Введение в классы, объекты и методы

Эта глава служит введением в классы. Класс составляетоснову языка С#, поскольку он определяет характеробъекта. Кроме того, класс служит основанием дляобъектно-ориентированного программирования (ООП).В пределах класса определяются данные и код. А поскольку классы и объекты относятся к основополагающим элементам С#, то для их рассмотрения требуется не одна главакниги. В данной главе рассмотрение классов и объектов начинается с их главных особенностей.Основные положения о классах

Классы использовались в примерах программ с самогоначала этой книги. Разумеется, это были лишь самые простые классы, что не позволяло выгодно воспользоватьсябольшинством их возможностей. На самом же деле классынамного более эффективны, чем это следует из приведенных ранее примеров их ограниченного применения.

Начнем рассмотрение классов с основных положений.Класс представляет собой шаблон, по которому определяется форма объекта. В нем указываются данные и код, который будет оперировать этими данными. В С# используетсяспецификация класса для построения объектов, которыеявляются экземплярами класса. Следовательно, класс, посуществу, представляет собой ряд схематических описаний способа построения объекта. При этом очень важноподчеркнуть, что класс является логической абстракцией.Физическое представление класса появится в оперативнойпамяти лишь после того, как будет создан объект этогокласса.Общая форма определения класса

При определении класса объявляются данные, которые он содержит, а также код,оперирующий этими данными. Если самые простые классы могут содержать толькокод или только данные, то большинство настоящих классов содержит и то и другое.

Вообще говоря, данные содержатся в членах данных, определяемых классом, а код —в функциях-членах. Следует сразу же подчеркнуть, что в C# предусмотрено несколькоразновидностей членов данных и функций-членов. Например, к членам данных, называемым также полями, относятся переменные экземпляра и статические переменные,а к функциям-членам — методы, конструкторы, деструкторы, индексаторы, события,операторы и свойства. Ограничимся пока что рассмотрением самых основных компонентов класса: переменных экземпляра и методов. А далее в этой главе будут представлены конструкторы и деструкторы. Об остальных разновидностях членов класса речьпойдет в последующих главах.



Класс создается с помощью ключевого слова class. Ниже приведена общая формаопределения простого класса, содержащая только переменные экземпляра и методы.class имя_класса { // Объявление переменных экземпляра. доступ тип переменная1; доступ тип переменная2; //... доступ тип переменнаяN; // Объявление методов. доступ возращаемый_тип метод1(параметры) { // тело метода } доступ возращаемый_тип метод2(параметры) { // тело метода } // ... доступ возращаемый_тип методы(параметры) { }}

Обратите внимание на то, что перед каждым объявлением переменной и методауказывается доступ. Это спецификатор доступа, например public, определяющийпорядок доступа к данному члену класса. Как упоминалось в главе 2, члены класса могут быть как закрытыми (private) в пределах класса, так открытыми (public), т.e. более доступными. Спецификатор доступа определяет тип разрешенного доступа. Указывать спецификатор доступа не обязательно, но если он отсутствует, то объявляемыйчлен считается закрытым в пределах класса. Члены с закрытым доступом могут использоваться только другими членами их класса. В примерах программ, приведенныхв этой главе, все члены, за исключением метода Main(), обозначаются как открытые(public). Это означает, что их можно использовать во всех остальных фрагментахкода — даже в тех, что определены за пределами класса. Мы еще вернемся к обсуждению спецификаторов доступа в главе 8.

ПРИМЕЧАНИЕПомимо спецификатора доступа, в объявлении члена класса могут также присутствоватьодин или несколько модификаторов. О модификаторах речь пойдет далее в этой главе.

Несмотря на отсутствие соответствующего правила в синтаксисе С#, правильносконструированный класс должен определять одну и только одну логическую сущность. Например, класс, в котором хранятся Ф.И.О. и номера телефонов, обычно не содержит сведения о фондовом рынке, среднем уровне осадков, циклах солнечных пятенили другую информацию, не связанную с перечисляемыми фамилиями. Таким образом, в правильно сконструированном классе должна быть сгруппирована логическисвязанная информация. Если же в один и тот же класс помещается логически несвязанная информация, то структурированность кода быстро нарушается.

Классы, использовавшиеся в приведенных ранее примерах программ, содержалитолько один метод: Main(). Но в представленной выше общей форме определениякласса метод Main() не указывается. Этот метод требуется указывать в классе лишь втом случае, если программа начинается с данного класса.Определение класса

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

Ниже приведен первый вариант класса Building. В нем определены три переменные экземпляра: Floors, Area и Occupants. Как видите, в классе Building вообщеотсутствуют методы. Это означает, что в настоящий момент этот класс состоит толькоиз данных. (Впоследствии в него будут также введены методы.)class Building { public int Floors; // количество этажей public int Area; // общая площадь здания public int Occupants; // количество жильцов}

Переменные экземпляра, определенные в классе Building, демонстрируют общийпорядок объявления переменных экземпляра. Ниже приведена общая форма для объявления переменных экземпляра:доступ тип имя_переменной;

где доступ обозначает вид доступа; тип — конкретный тип переменной, а имя_пере-менной — имя, присваиваемое переменной. Следовательно, за исключением спецификатора доступа, переменная экземпляра объявляется таким же образом, как и локальная переменная. Все переменные объявлены в классе Building с предваряющим ихмодификатором доступа public. Как пояснялось выше, благодаря этому они становятся доступными за пределами класса Building.

Определение class обозначает создание нового типа данных. В данном случае новый тип данных называется Building. С помощью этого имени могут быть объявленыобъекты типа Building. Не следует, однако, забывать, что объявление class лишьописывает тип, но не создает конкретный объект. Следовательно, в приведенном вышефрагменте кода объекты типа Building не создаются.