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

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

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

Добавлен: 11.12.2025

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

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

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

Аналогично, в следующем фрагменте кода сохраняются ссылки на строки strinJ

описывающие модель и производителя myCar:

myCar . sManufacturer = "BMW"; myCar.sModel = " I s e t t a " ;

(Isetta— небольшой автомобиль, который производился в 1950-х годах и имел одя

дверь впереди.)

Пример объектно-основанной программы

Программа V e h i c l e D a t a O n l y очень проста и делает следующее:

определяет класс V e h i c l e ; создает объект myCar; указывает свойства myCar;

получает значения свойств myCar и выводит их на экран.

Вот код программы V e h i c l e D a t a O n l y :

/ / V e h i c l e D a t a O n l y

 

 

 

//

Создает

объект V e h i c l e ,

заполняет

ег о

члены информацией,

//

вводимой

с клавиатуры,

и выводит

ее на

экран

u s i n g System ;

namespace V e h i c l e D a t a O n l y

{

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 nNumOf Wheels,-

//Модель

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

//Количество дверей

//Количество колес

}

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

{

//Начало программы

s t a t i c v o i d M a i n ( s t r i n g [ ] a r g s )

{

//Приглашение пользователю

C o n s o l e . W r i t e L i n e ( " В в е д и т е информацию о машине");

// Создание экземпляра V e h i c l e V e h i c l e myCar = new V e h i c l e (),-

//Ввод информации для членов класса

Console . Write("Модел ь = " ) ;

s t r i n g s = C o n s o l e . R e a d L i n e ( ) ; myCar.sModel = s;

118

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



// Можно присваивать значения непосредственно Console . Write("Производител ь = " ) ;

myCar . sManufacturer = C o n s o l e . R e a d L i n e О ;

//Остальные данные имеют тип i n t

Console . Write("Количеств о дверей =

" ) ;

s = C o n s o l e . R e a d L i n e ( ) ;

 

myCar.nNumOfDoors

=

C o n v e r t . T o I n t 3 2 ( s ) , -

Console . Write("Количеств о колес =

" ) ;

s = C o n s o l e . R e a d L i n e ( ) ;

 

myCar.nNumOfWheels

=

C o n v e r t . T o I n t 3 2 ( s ) ;

// Вывод полученной

информации

 

Console . WriteLine("\пВаш а машина:

" ) ;

Console . WriteLine(myCar . sManufacture r + " " +

 

myCar . sModel) ;

 

C o n s o l e . W r i t e L i n e ( " c

" + myCar.nNumOfDoors +

 

"

дверями, "

 

+"на " + myCar.nNumOfWheels

+" колесах" ) ;

//Ожидаем подтверждения пользователя

Console . WriteLine("Нажмите <Enter> для " + "завершения программы.. . ") ;

C o n s o l e . R e a d ( ) ;

Листинг программы начинается с определения класса V e h i c l e .

Определение класса может находиться как до, так и после класса Program — это не имеет значения. Однако вам нужно принять какой-то один стиль и сле­ довать ему.

Программа создает объект myCar класса V e h i c l e , а затем заполняет все его поля информацией, вводимой пользователем с клавиатуры. Проверка корректности входных данных не производится. Затем программа выводит введенные данные на экран в немно­ го ином формате.

Вывод этой программы выглядит следующим образом:

Введите информацию о машине

Модель

 

=

M e t r o p o l i t a n

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

=

Nash

Количество

дверей

=

2

Количество

колес

 

=

4

Ваша м а ш и н а :

 

 

 

 

Nash Metropolita n

 

 

с 2 дверями,

на

4

колесах

Нажмите <Enter>

для

завершения программы...

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

119


Вызов Read ( ) , в отличие от ReadLine ( ) , оставляет курсор сразу за введен! ной строкой. Это приводит к тому, что ввод пользователя находится на той nil строке, что и приглашение. Кроме того, добавление символа новой стромГ

'\ п ' создает пустую строку без необходимости вызывать WriteLin e ( ) .

От л и ч ие между объектами

Заводы в Детройте в состоянии выпускать множество автомобилей и отслеживать кажду»| выпущенную машину и при этом не путать их. Аналогично, программа может создать не­ сколько объектов одного и того же класса, как показано в следующем фрагменте:

V e h i c l e c a r l

= new

V e h i c l e О ;

c a r l . s M a n u f a c t u r e r

= "Studebaker" ;

c a r l . s M o d e l

= "Avanti" ;

// Следующий

код никак не влияет на c a r l

V e h i c l e c a r 2

= new

V e h i c l e ( ) ;

c a r 2 . s M a n u f a c t u r e r

= "Hudson";

c a r 2 . s M o d e l = " H o r n e t " ;

Создание объекта c a r 2 и присваивание ему имени и производителя никак не влияй] на объект c a r l .

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

С с ы л к и

Оператор "точка" и оператор присваивания — единственные два оператора, опреде­ ленные для ссылочных типов. Рассмотрим следующий фрагмент исходного текста:

//Создание нулевой ссылки

V e h i c l e yourCar;

//Присваивание значения ссылке

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

// Использование точки для обращения к члену yourCar . sManufacture r = "Rambler";

// Создание новой ссылки,

которая указывает на тот же объект

V e h i c l e yourSpousalCa r =

yourCar;

В первой строке создается объект yourCar, причем без присваивания ему значения, Такая неинициализированная ссылка называется нулевым объектом (null object). Любые попытки использовать неинициализированную ссылку приводят к немедленной генера­ ции ошибки, которая прекращает выполнение программы.

Компилятор С# может перехватить большинство попыток использования не инициализированной ссылки и сгенерировать предупреждение в процессе ком пиляции программы. Если вам каким-то образом удалось провести компьютер то обращение к неинициализированной ссылке при выполнении программь приведет к ее аварийному останову.

Второе выражение создает новый объект V e h i c l e и присваивает его ссылочной пе-1 ременной y o u r C a r . И последняя строка кода присваивает ссылке y o u r S p o u s a l C a r l

120

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


ссылку yourCar. Как показано на рис. 6.1, это приводит к тому, что yourSpousalCa r

ссылается на тот же объект, что и yourCar.

Рис. 6.1. Взаимоотношения между дву­ мя ссылками на один и тот же объект

Эффект от следующих двух вызовов одинаков:

// Создание вашей

машины

Vehicle yourCar

=

new V e h i c l e () ;

yourCar. sModel

=

" K a i s e r " ;

//Эта машина принадлежит и вашей жене Vehicle yourSpousalCa r = yourCar;

//Изменяя одну машину, вы изменяете и другую

yourSpousalCar. sModel = "Henry J " ;

Console.WriteLine("Ваша машина - " + y o u r C a r . s M o d e l ) ;

Выполнение данной программы приводит к выводу на экран названия модели Henry J, а не Kaiser . Обратите внимание, что yourSpousalCa r не указывает на yourCar— вместо этого просто и yourSpousalCar , и yourCar указывают,на один и тот же объект.

Кроме того, ссылка y o u r S p o u s a l C a r будет корректна, даже если окажется "потерянной" (например, при выходе за пределы области видимости), как показано

вследующем фрагменте:

//Создание вашей машины

Vehicle yourCar

=

new V e h i c l e () ;

yourCar. sModel

=

" K a i s e r " ;

//Эта машина принадлежит и вашей жене Vehicle yourSpousalCa r = yourCar;

//Когда она забирае т с е б е вашу машину...

yourCar = n u l l ; // yourCar теперь ссылается на "нулевой

//объект"

//. . . yourSpousalCar ссылается на все ту же машину

Console.WriteLine("Ваша машина - " + y o u r S p o u s a l C a r . s M o d e l ) ;

Выполнение этого фрагмента исходного текста выводит на экран сообщение "Ваша машина - K a i s e r " несмотря на то, что ссылка yourCa r стала недейст­ вительной.

Объект перестал быть достижимым по ссылке yourCar. Но он не будет пол­ ностью недостижимым, пока не будут "потеряны" или обнулены обе ссылки — и yourCar, и yourSpousalCar .

После этого — вернее будет сказать, в некоторый непредсказуемый момент после этого — сборщик мусора (garbage collector) С# вернет память, использованную ранее под

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

121