ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3248

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Сначала вычисляется выражение в круглых скобках после оператора s w i t c h . В дан ном случае это просто значение переменной n M a r i t a l S t a t u s . Затем вычисленщ значение сравнивается со значениями у каждого из операторов c a s e . Если нужное зна чение не найдено, управление передается операторам, следующим за меткой default.

Аргументом оператора s w i t c h может быть также строка s t r i n g : s t r i n g s = " D a v i s " ;

s w i t c h ( s )

{

c a s e " M a l l o r y " :

// Некоторые действия break ;

c a s e " W e l l s " :

// Некоторые действия break ;

c a s e "Arturo" :

// Некоторые действия break ;

c a s e "Brown":

// Некоторые действия break ;

d e f a u l t :

//Действия, если такой

//фамилии нет в списке

}

При применении конструкции s w i t c h действует ряд ограничений.

S Аргумент оператора s w i t c h () должен иметь перечислимый тип или тип s t r i n g .

S Нельзя использовать числа с плавающей точкой.

^ Значения c a s e должны иметь тот же тип, что аргумент оператора s w i t c h .

SЗначения c a s e должны быть константами в том смысле, что их значения должны быть известны во время компиляции.

S Каждая конструкция c a s e должна завершаться оператором break (или какой-то иной командой выхода, например, return) . Оператор break передает управле­ ние за пределы конструкции s w i t c h .

Допускается наличие нескольких c a s e для одного блока кода, как в следующем примере: s w i t c h ( n M a r i t a l S t a t u s )

{

c a s e

0 .-

 

 

 

c a s e

2 :

 

 

 

 

//

Действия

для

холостяков/незамужних и для

 

// разведенных одни и те же

 

break ;

 

 

c a s e

1 :

 

 

 

 

//

Действия

для

семейных

break ;

110

Часть II. Основы программирования в С#


case

3 :

 

 

 

//

 

Действия для вдов(цов)

 

break;

 

case

4

:

 

 

 

// Действия для неизвестног о семейного состояния

 

break;

 

d e f a u l t :

 

 

 

//

 

Действия,

когда переменная принимает значение,

 

//

 

отличающееся от все х перечисленных выше - по все й

 

//

 

видимости,

эт о означает , что произошла какая - то

 

//

 

ошибка

 

break;

}

Управление может быть передано в другую точку при помощи оператора безусловно­ го перехода g o t o . За этим оператором может следовать:

метка;

cas e в конструкции s w i t c h ;

ключевое слово d e f a u l t , обозначающее блок d e f a u l t в конструкции s w i t c h .

Два последних случая предназначены для перехода от одного блока c a s e к другому в конструкции s w i t c h .

 

Вот пример применения оператора g o t o :

//

Если

условие и с т и н н о . . .

if

(а >

Ь)

I

 

 

 

//

Управление оператором g o t o передаетс я коду,

 

//

расположенному за меткой e x i t L a b e l

I'goto e x i t L a b e l ;

//Некоторый программный код exitLabel:

//Управление передаетс я в э т у точку

Оператор g o t o крайне непопулярен

по той

же причине, по которой он является

очень мощным средством — в силу его

полной

неструктурированности. Отслеживание

переходов в нетривиальных случаях, превышающих несколько строк кода, — крайне не­ благодарная задача. Это именно тот случай, когда говорят о "соплях" в программе.

Вокруг применения g o t o ведутся почти "религиозные войны". Доходит до критики С# просто за то, что в нем есть этот оператор. Но на самом деле в нем нет ничего ужасного или демонического. Другое дело, что его применения сле­ дует избегать, если в этом нет крайней нужды.

Глава 5. Управление потоком выполнения

111


Одно дело — объявить переменные там и сям, и складывать их, и вы­ читать. И совсем другое — писать реальные программы, которыми может пользоваться еще кто-то. В этой части речь пойдет о том, как группировать данные и работать с ними. Вы научитесь думать о про­ граммах как о наборе сотрудничающих объектов и приступите к созданию собственных объектов. Это заложит основу для всей вашей будущей деятельности в качестве программистов.

Глава 6

Объединение данных - классы и массивы

>Введение в классы С#

>Хранение данных в объектах

>Ссылки на объекты

>Создание массивов объектов

ы можете

свободно объявлять и использовать все встроенные типы данных —

такие как

i n t , d o u b l e или b o o l — для хранения информации, необходимой

вашей программе. Для ряда программ таких простых переменных вполне достаточно, но

большинству программ требуется средство для объединения связанных данных в акку­

ратные пакеты.

Некоторым программам надо собрать вместе данные, связанные логически, но имеющие разные типы. Например, приложение, работающее со списками студентов, должно хранить разнотипную информацию о них — имя, год рождения, успеваемость

и т.п. Логически рассуждая,

имя

студента

может

иметь тип s t r i n g , год рождения —

int или s h o r t , средний б а л л —

d o u b l e .

Такой

программе необходима возможность

объединить эти разнотипные

переменные

в единую структуру под именем S t u d e n t .

К счастью, в С# имеется структура, известная как класс, которая предназначена для об­ легчения группирования таких разнотипных переменных.

В других случаях программам требуются наборы однотипных объектов. Возьмем для примера программу, которая должна усреднять успеваемость. Тип d o u b l e — естест­ венный кандидат для представления индивидуальной успеваемости студента, но для того чтобы представлять успеваемость группы студентов, необходим тип, который является набором d o u b l e . Для таких целей в С# существуют массивы.

И наконец, реальной программе для работы с информацией о студентах могут пона­ добиться как классы, так и массивы, причем объединенные в одно целое — массив сту­ дентов. С# позволяет получить желаемое.

Классы

Класс представляет собой объединение разнотипных данных и функций, логически организованных в единое целое. С# предоставляет полную свободу при создании клас­ сов, но хорошо спроектированные классы призваны представлять концепции.


Аналитик скорее всего скажет, что "класс отображает концепцию из предметной об ласти задачи в программу". Предположим, например, что ваша задача— построения имитатора дорожного движения, который должен смоделировать улицы, перекрестка шоссе и т.п.

Любое описание такой задачи должно включать термин транспортное средство Транспортные средства обладают определенной максимальной скоростью движении имеют вес, и некоторые из них оснащены прицепами. Таким образом, имитатор дорож ного движения должен включать класс V e h i c l e , у которого должны иметься свойств наподобие dTopSpeed, nWeight и b T r a i l e r .

Поскольку классы — центральная концепция в программировании на С#, они буи гораздо детальнее рассмотрены в главах части IV, "Объектно-ориентированное программирование"; здесь же описаны только азы.

О п р е д е л е н и е к л а с с а

Пример класса V e h i c l e может выглядеть следующим образом:

p u b l i c c l a s s V e h i c l e

 

 

 

{

 

 

 

 

 

p u b l i c

s t r i n g sModel;

/ /

Название модели

p u b l i c

s t r i n g sManufacturer ;

/ /

Производитель

p u b l i c

i n t

nNumOfDoors;

/ /

Количество

дверей

p u b l i c

i n t

nNumOfWheels;

//

Количество

колес

}

 

 

 

 

 

Определение класса начинается словами

p u b l i c c l a s s ,

за которыми идет имя

класса (в данном случае — V e h i c l e ) .

 

 

 

Как и все имена в С#, имена классов чувствительны к регистру. С# не имея никаких правил для именования классов, но неофициальная традиция гласит что имена классов начинаются с прописной буквы.

За именем класса следует пара фигурных скобок, внутри которых могут быть не сколько членов (либо ни одного). Члены класса представляют собой переменные, образующие часть класса. В данном примере класс V e h i c l e начинается с члена string sModel, который содержит название модели транспортного средства. Второй член в этом примере — s t r i n g sManuf a c t u r e r , а последние два члена содержат количество дверей и колес в транспортном средстве.

Как и в случае обычных переменных, делайте имена членов максимально информативными. Хотя я и добавил к именам членов комментарии, они не являются обязательными с точки зрения С#. Обо всем должны говорить имена переменных.

Модификатор p u b l i c перед именем класса делает класс доступным для всей про-! граммы. Аналогично, модификаторы p u b l i c перед именами членов также делают их доступными для всей программы. Возможны и другие модификаторы, но более подроб­ но о доступности речь пойдет в главе 11, "Классы".

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

116

Часть III. Объектно-основанное программирование

Глав,

 


Что такое о б ъ е к т

Объект класса объявляется аналогично встроенным объектам С#, но не идентично им.

Термин объект используется для обозначения "вещей". Да, это не слишком полезное определение, так что приведем несколько примеров. Переменная типа i n t является объектом i n t . Автомобиль является объектом V e h i c l e .

Вот фрагмент кода, создающий автомобиль, являющийся объектом V e h i c l e :

Vehicle myCar;

myCar = new V e h i c l e () ;

В первой строке объявлена переменная myCar типа V e h i c l e , так же как вы можете

объявить переменную nSomething класса

i n t (да, класс является типом, и все объекты

С# определяются как классы). Команда

new V e h i c l e () создает конкретный объект

типа Vehicle и сохраняет его местоположение в переменной myCar. Оператор new ("новый") не имеет ничего общего с возрастом автомобиля — он просто выделяет новый блок памяти, в котором ваша программа может хранить свойства автомобиля myCar.

В терминах С# myCar — это объект класса V e h i c l e . Можно также сказать, что myCar— экземпляр класса V e h i c l e . В данном контексте экземпляр

(instance) означает "пример" или "один из". Можно использовать этот термин и как глагол, и говорить об инстащировании V e h i c l e — это именно то, что

делает оператор new.

Сравните объявление myCar с объявлением переменной num типа i n t :

int num; num = 1;

В первой строке объявлена переменная num типа i n t , а во второй созданной пере­ менной присваивается значение типа i n t , которое вносится в память по месту располо­ жения переменной num.

Переменная встроенного типа num и объект my Саг хранятся в памяти поразному. Константа 1 не занимает память, поскольку и процессор, и С# знают, что такое 1. Но процессор понятия не имеет о такой концепции, как V e h i c l e . Выражение new V e h i c l e выделяет память, необходимую для описания транспортного средства, понятного процессору, С#, и вообще — всему миру.

Доступ к ч л е н а м о б ъ е к т а

Каждый объект класса V e h i c l e имеет собственный набор членов.

Приведенное да­

лее выражение сохраняет число 1 в члене nNumberOf Doors объекта,

на который ссы­

лается myCar:

 

 

 

 

myCar. nNumberOf Door s = 1;

 

 

 

Каждый оператор С# имеет не только значение, но и тип. Объект myCar явля­

ется объектом типа V e h i c l e . Переменная V e h i c l e .nNumberOf Doors

име­

ет тип i n t

(вернитесь к определению

класса V e h i c l e ) . Константа 1

также

имеет тип

i n t , так что типы константы

с правой стороны от оператора при­

сваивания и переменной с левой стороны соответствуют друг другу.

Глава 6. Объединение данных - классы и массивы

117