Чтение онлайн

на главную - закладки

Жанры

Полное руководство. С# 4.0
Шрифт:

Но классам Building и BuildingDemo совсем не обязательно находиться в одном и том же исходном файле. Каждый из них можно поместить в отдельный файл, на пример Building.cs и BuildingDemo.cs, а компилятору C# достаточно сообщить, что оба файла должны быть скомпилированы вместе. Так, если разделить рассматри ваемую здесь программу на два таких файла, для ее компилирования можно восполь зоваться следующей командной строкой. csc Building.cs BuildingDemo.cs

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

в одном объекте может отли чаться от их содержимого в другом объекте. Между обоими объектами не существует никакой связи, за исключением того факта, что они являются объектами одного и того же типа. Так, если имеются два объекта типа Building, то у каждого из них своя ко пия переменных Floors, Area и Occupants, а их содержимое в обоих объектах может отличаться. Этот факт демонстрируется в следующей программе. // В этой программе создаются два объекта типа Building. using System; class Building { public int Floors; // количество этажей public int Area; // общая площадь здания public int Occupants; // количество жильцов } // В этом классе объявляются два объекта типа Building. class BuildingDemo { static void Main { Building house = new Building; Building office = new Building; int areaPP; // площадь на одного человека // Присвоить значения полям в объекте house. house.Occupants = 4; house.Area = 2500; house.Floors = 2; // Присвоить значения полям в объекте office. office.Occupants = 25; office.Area = 4200; office.Floors = 3; // Вычислить площадь на одного человека в жилом доме. areaPP = house.Area / house.Occupants; Console.WriteLine("Дом имеет\n " + house.Floors + " этажа\n " + house.Occupants + " жильца\n " + house.Area + " кв. футов общей площади, из них\n " + areaPP + " приходится на одного человека"); // Вычислить площадь на одного человека в учреждении. areaPP = office.Area / office.Occupants; Console.WriteLine("Учреждение имеет:\n " + office.Floors + " этажа\n " + office.Occupants + " работников\n " + office.Area + " кв. футов общей площади, из них\n " + areaPP + " приходится на одного человека"); } }

Ниже приведен результат выполнения этой программы. Дом имеет: 2 этажа 4 жильца 2500 кв. футов общей площади, из них 625 приходится на одного человека Учреждение имеет: 3 этажа 25 работников 4200 кв. футов общей площади, из них 168 приходится на одного человека

Как видите, данные из объекта house полностью отделены от данных, содержащих ся в объекте office. Эта ситуация наглядно показана на рис. 6.1.

Рис. 6.1. Переменные экземпляра одного объекта полностью отделены от переменных экземпляра другого объекта Создание объектов

В предыдущих примерах программ для объявления объекта типа Building ис пользовалась следующая строка кода. Building house = new Building!);

Эта строка объявления выполняет три функции. Во-первых, объявляется перемен ная house, относящаяся к типу класса Building. Сама эта переменная не является объектом, а лишь переменной, которая может ссылаться на объект. Во-вторых, соз дается конкретная, физическая, копия объекта. Это делается с помощью оператора new. И наконец, переменной house присваивается ссылка на данный объект. Таким образом, после выполнения анализируемой строки объявленная переменная house ссылается на объект типа Building.

Оператор new динамически (т.е. во время выполнения) распределяет память для объ екта и возвращает ссылку на него, которая затем сохраняется в переменной. Следова тельно, в C# для объектов всех классов должна быть динамически распределена память.

Как и следовало ожидать, объявление переменной house можно отделить от созда ния объекта, на который она ссылается, следующим образом. Building house; // объявить ссылку на объект house = new Building; // распределить память для объекта типа Building

В первой строке объявляется переменная house в виде ссылки на объект типа Building. Следовательно, house — это переменная, которая может ссылаться на объ ект, хотя сама она не является объектом. А во второй строке создается новый объект типа Building, и ссылка на него присваивается переменной house. В итоге перемен ная house оказывается связанной с данным объектом.

То

обстоятельство, что объекты классов доступны по ссылке, объясняет, почему классы называются ссылочными типами. Главное отличие типов значений от ссылочных типов заключается в том, что именно содержит переменная каждого из этих типов. Так, переменная типа значения содержит конкретное значение. Например, во фраг менте кода int х; х = 10;

переменная х содержит значение 10, поскольку она относится к типу int, который является типом значения. Но в строке Building house = new Building;

переменная house содержит не сам объект, а лишь ссылку на него. Переменные ссылочного типа и присваивание

В операции присваивания переменные ссылочного типа действуют иначе, чем пе ременные типа значения, например типа int. Когда одна переменная типа значения присваивается другой, ситуация оказывается довольно простой. Переменная, находя щаяся в левой части оператора присваивания, получает копию значения переменной, находящейся в правой части этого оператора. Когда же одна переменная ссылки на объект присваивается другой, то ситуация несколько усложняется, поскольку такое присваивание приводит к тому, что переменная, находящаяся в левой части оператора присваивания, ссылается на тот же самый объект, на который ссылается переменная, находящаяся в правой части этого оператора. Сам же объект не копируется. В силу этого отличия присваивание переменных ссылочного типа может привести к несколь ко неожиданным результатам. В качестве примера рассмотрим следующий фрагмент кода. Building house1 = new Building; Building house2 = house1;

На первый взгляд, переменные house1 и house2 ссылаются на совершенно разные объекты, но на самом деле это не так. Переменные house1 и house2, напротив, ссы лаются на один и тот же объект. Когда переменная house1 присваивается переменой house2, то в конечном итоге переменная house2 просто ссылается на тот же самый объ ект, что и переменная house1. Следовательно, этим объектом можно оперировать с по мощью переменной house1 или house2. Например, после очередного присваивания house1.Area = 2600;

оба метода WriteLine Console.WriteLine(house1.Area); Console.WriteLine(house2.Area);

выводят одно и то же значение: 2600.

Несмотря на то что обе переменные, house1 и house2, ссылаются на один и тот же объект, они никак иначе не связаны друг с другом. Например, в результате следующей последовательности операций присваивания просто изменяется объект, на который ссылается переменная house2. Building house1 = new Building; Building house2 = house1; Building house3 = new Building; house2 = house3; // теперь обе переменные, house2 и house3, // ссылаются на один и тот же объект.

После выполнения этой последовательности операций присваивания перемен ная house2 ссылается на тот же самый объект, что и переменная house3. А ссылка на объект в переменной house1 не меняется. Методы

Как пояснялось выше, переменные экземпляра и методы являются двумя основны ми составляющими классов. До сих пор класс Building, рассматриваемый здесь в каче стве примера, содержал только данные, но не методы. Хотя классы, содержащие только данные, вполне допустимы, у большинства классов должны быть также методы. Методы представляют собой подпрограммы, которые манипулируют данными, определенны ми в классе, а во многих случаях они предоставляют доступ к этим данным. Как прави ло, другие части программы взаимодействуют с классом посредством его методов.

Метод состоит из одного или нескольких операторов. В грамотно написанном коде C# каждый метод выполняет только одну функцию. У каждого метода имеется свое имя, по которому он вызывается. В общем, методу в качестве имени можно присвоить любой действительный идентификатор. Следует, однако, иметь в виду, что идентифи катор Main зарезервирован для метода, с которого начинается выполнение програм мы. Кроме того, в качестве имен методов нельзя использовать ключевые слова С#.

В этой книге методы именуются в соответствии с условными обозначениями, при нятыми в литературе по С#. В частности, после имени метода следуют круглые скобки. Так, если методу присвоено имя GetVal, то в тексте книги он упоминается в следую щем виде: GetVal. Такая форма записи помогает отличать имена методов от имен переменных при чтении книги.

Поделиться:
Популярные книги

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Шаман. Похищенные

Калбазов Константин Георгиевич
1. Шаман
Фантастика:
боевая фантастика
попаданцы
6.44
рейтинг книги
Шаман. Похищенные

Совок

Агарев Вадим
1. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
8.13
рейтинг книги
Совок

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Плохая невеста

Шторм Елена
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Плохая невеста