Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Для того чтобы создать конкретный объект типа Building, придется воспользоваться следующим оператором.Building house = new Building(); // создать объект типа Building
После выполнения этого оператора объект house станет экземпляром классаBuilding, т.е. обретет "физическую" реальность. Не обращайте пока что внимание наотдельные составляющие данного оператора.
Всякий раз, когда получается экземпляр класса, создается также объект, содержащий собственную копию каждой переменной экземпляра, определенной в данномклассе. Таким образом, каждый объект типа Building будет содержать свои копиипеременных экземпляра Floors, Area и Occupants. Для доступа к этим переменным служит оператор доступа к члену класса, который принято называть оператором-точкой. Оператор-точка связывает имя объекта с именем члена класса. Ниже приведена общая форма оператора-точки.объект.член
В этой форме объект указывается слева, а член — справа. Например, присваивание значения 2 переменной Floors объекта house осуществляется с помощью следующего оператора.house.Floors = 2;
В целом, оператор-точка служит для доступа к переменным экземпляра и методам. Ниже приведен полноценный пример программы, в которой используется классBuilding.// Программа, в которой используется класс 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 int areaPP; // площадь на одного человека // Присвоить значения полям в объекте house. house.Occupants = 4; house.Area = 2500; house.Floors = 2; // Вычислить площадь на одного человека. areaPP = house.Area / house.Occupants; Console.WriteLine("Дом имеет:n " + house.Floors + " этажаn " + house.Occupants + " жильцаn " + house.Area + " кв. футов общей площади, из нихn " + агеаРР + " приходится на одного человека"); }}
Эта программа состоит из двух классов: Building и BuildingDemo. В классеBuildingDemo сначала создается экземпляр house класса Building с помощью метода Main(), а затем в коде метода Main() осуществляется доступ к переменным экземпляра house для присваивания им значений и последующего использования этихзначений. Следует особо подчеркнуть, что Building и BuildingDemo — это два совершенно отдельных класса. Единственная взаимосвязь между ними состоит в том, чтов одном из них создается экземпляр другого. Но, несмотря на то, что это раздельныеклассы, у кода из класса BuildingDemo имеется доступ к членам класса Building,поскольку они объявлены как открытые (public). Если бы при их объявлении не былуказан спецификатор доступа public, то доступ к ним ограничивался бы пределамиBuilding, а следовательно, их нельзя было бы использовать в классе BuildingDemo.Допустим, что исходный текст приведенной выше программы сохранен в файлеUseBuilding.cs. В результате ее компиляции создается файл UseBuilding.exe.При этом оба класса, Building и BuildingDemo, автоматически включаются в состависполняемого файла. При выполнении данной программы выводится следующий результат.Дом имеет:2 этажа4 жильца2500 кв. футов общей площади, из них625 приходится на одного человека
Но классам 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 оказывается связанной с данным объектом.