ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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 |