Добавить в цитаты Настройки чтения

Страница 32 из 188

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

Рассмотрим основные элементы этой программы, начиная с методаAreaPerPerson(). Первая его строка выглядит следующим образом.public void AreaPerPerson() {

В этой строке объявляется метод, именуемый AreaPerPerson и не имеющий параметров. Для него указывается тип public, а это означает, что его можно вызывать из любойдругой части программы. Метод AreaPerPerson() возвращает пустое значение типаvoid, т.е. он практически ничего не возвращает вызывающей части программы. Анализируемая строка завершается фигурной скобкой, открывающей тело данного метода.

Тело метода AreaPerPerson() состоит всего лишь из одного оператора.Console.WriteLine(" " + Area / Occupants + " приходится на одного человека");

Этот оператор осуществляет вывод величины площади на одного человека, которая получается путем деления общей площади здания (переменной Area) на количество жильцов (переменную Occupants). А поскольку у каждого объекта типаBuilding имеется своя копия переменных Area и Occupants, то при вызове методаAreaPerPerson() в вычислении используются копии этих переменных, принадлежащие вызывающему объекту.

Метод AreaPerPerson() завершается закрывающейся фигурной скобкой. Когдавстречается эта скобка, управление передается обратно вызывающей части программы.Далее проанализируем внимательно следующую строку кода из метода Main().house.AreaPerPerson();

В этой строке вызывается метод AreaPerPerson() для объекта house. Это означает, что метод AreaPerPerson() вызывается относительно объекта, на которыйссылается переменная house, и для этой цели служит оператор-точка. Когда методAreaPerPerson() вызывается, ему передается управление программой. А по его завершении управление передается обратно вызывающей части программы, выполнение которой возобновляется со строки кода, следующей после вызова данного метода.

В данном случае в результате вызова house.AreaPerPerson() выводится площадь на одного человека в здании, определенном в объекте house. Аналогично, в результате вызова office.AreaPerPerson() выводится площадь на одного человекав здании, определенном в объекте office. Таким образом, при каждом вызове методаAreaPerPerson() выводится площадь на одного человека для указанного объекта.

В методе AreaPerPerson() особого внимания заслуживает следующее обстоятельство: обращение к переменным экземпляра Area и Occupants осуществляется непосредственно, т.е. без помощи оператора-точки. Если в методе используется переменнаяэкземпляра, определенная в его классе, то делается это непосредственно, без указанияявной ссылки на объект и без помощи оператора-точки. Понять это нетрудно, если хорошенько подумать. Ведь метод всегда вызывается относительно некоторого объекта егокласса. Как только вызов произойдет, объект становится известным. Поэтому объект ненужно указывать в методе еще раз. В данном случае это означает, что переменные экземпляра Area и Occupants в методе AreaPerPerson() неявно ссылаются на копииэтих же переменных в том объекте, который вызывает метод AreaPerPerson().

ПРИМЕЧАНИЕПопутно следует заметить, что значение переменной Occupants в методеAreaPerPerson() не должно быть равно нулю (это касается всех примеров, приведенныхв данной главе). Если бы значение переменной Occupants оказалось равным нулю, топроизошла бы ошибка из-за деления на нуль. В главе 13, где рассматриваются исключительныеситуации, будет показано, каким образом в C# отслеживаются и обрабатываются ошибки,которые могут возникнуть во время выполнения программы.Возврат из метода

В целом, возврат из метода может произойти при двух условиях. Во-первых, когдавстречается фигурная скобка, закрывающая тело метода, как показывает пример методаAreaPerPerson() из приведенной выше программы. И во-вторых, когда выполняетсяоператор return. Имеются две формы оператора return: одна — для методов типаvoid, т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения. Первая форма рассматривается в этом разделе, а в следующем разделе будет пояснено, каким образом значения возвращаются из методов.

Для немедленного завершения метода типа void достаточно воспользоватьсяследующей формой оператора return.return;



Когда выполняется этот оператор, управление возвращается вызывающей частипрограммы, а оставшийся в методе код пропускается. В качестве примера рассмотримследующий метод.public void MyMeth() { int i; for(i=0; i<10; i++) { if(i == 5) return; // прервать на шаге 5 Console.WriteLine(); }}

В данном примере выполняется лишь 5 полноценных шагов цикла for, посколькупри значении 5 переменной i происходит возврат из метода.

В методе допускается наличие нескольких операторов return, особенно если имеются два или более вариантов возврата из него. Например:public void MyMeth() { //... if(done) return; // ... if(error) return;}

В данном примере возврат из метода происходит в двух случаях: если метод завершает свою работу или происходит ошибка. Но пользоваться таким приемом программирования следует очень аккуратно. Ведь из-за слишком большого числа точеквозврата из метода может нарушиться структура кода.

Итак, напомним еще раз: возврат из метода типа void может произойти при двухусловиях: по достижении закрывающей фигурной скобки или при выполнении оператора return.Возврат значения

Методы с возвратом типа void нередко применяются в программировании, темне менее, большинство методов возвращает конкретное значение. В действительностиспособность возвращать значение является одним из самых полезных свойств метода.Возврат значения уже демонстрировался в главе 3 на примере метода Math.Sqrt(),использовавшегося для получения квадратного корня.

Возвращаемые значения используются в программировании с самыми разнымицелями. В одних случаях, как в примере метода Math.Sqrt(), возвращаемое значениесодержит результат некоторого вычисления, в других — оно может просто указыватьна успешное или неудачное завершение метода, а в третьих — содержать код состояния. Но независимо от преследуемой цели использование возвращаемых значенийявляется неотъемлемой частью программирования на С#.

Для возврата значения из метода в вызывающую часть программы служит следующая форма оператора return:return значение;

где значение — это конкретное возвращаемое значение.

Используя возвращаемое значение, можно усовершенствовать рассматривавшийсяранее метод AreaPerPerson(). Вместо того чтобы выводить величину площади наодного человека, лучше возвратить ее из этого метода. Среди прочих преимуществтакого подхода следует особо отметить возможность использовать возвращаемое значение для выполнения других вычислений. Приведенный ниже пример представляетсобой улучшенный вариант рассматривавшейся ранее программы с усовершенствованным методом AreaPerPerson(), возвращающим величину площади на одногочеловека вместо того, чтобы выводить ее.// Возвратить значение из метода AreaPerPerson().using System;class Building { public int Floors; // количество этажей public int Area; // общая площадь здания public int Occupants; // количество жильцов // Возвратить величину площади на одного человека, public int AreaPerPerson() { return Area / Occupants; }}// Использовать значение, возвращаемое методом AreaPerPerson!).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.AreaPerPerson(); Console.WriteLine("Дом имеет:n " + house.Floors + " этажаn " + house.Occupants + " жильцаn " + house.Area + " кв. футов общей площади, из нихn " + areaPP + " приходится на одного человека"); Console.WriteLine(); // Получить площадь на одного человека в учреждении. areaPP = office.AreaPerPerson(); Console.WriteLine("Учреждение имеет:n " + office.Floors + " этажаn " + office.Occupants + " работниковn " + office.Area + " кв. футов общей площади, из нихn " + areaPP + " приходится на одного человека"); }}