Полное руководство. С# 4.0
Шрифт:
Ниже приведена общая форма определения метода: доступ возращаемый_тип имя(список_параметров) { // тело метода }
где доступ — это модификатор доступа, определяющий те части программы, из ко торых может вызываться метод. Как пояснялось выше, указывать модификатор досту па необязательно. Но если он отсутствует, то метод оказывается закрытым (private) в пределах того класса, в котором он объявляется. Мы будем пока что объявлять методы открытыми (public), чтобы вызывать их из любой другой части кода в программе. За тем возращаемыйтип обозначает тип данных, возвращаемых методом. Этот тип должен быть действительным, в том числе и типом создаваемого класса. Если метод не возвра щает значение, то в качестве возвращаемого для него следует указать тип void. Далее имя обозначает
Как пояснялось выше, методы класса, как правило, манипулируют данными класса и предоставляют доступ к ним. С учетом этого напомним, что в приведенных выше примерах в методе Main вычислялась площадь на одного человека путем деления общей площади здания на количество жильцов. И хотя такой способ формально счи тается правильным, на самом деле он оказывается далеко не самым лучшим для орга низации подобного вычисления. Площадь на одного человека лучше всего вычислять в самом классе Building, просто потому, что так легче понять сам характер вычисле ния. Ведь площадь на одного человека зависит от значений в полях Area и Occupants, инкапсулированных в классе Building. Следовательно, данное вычисление может быть вполне произведено в самом классе Building. Кроме того, вводя вычисление площади на одного человека в класс Building, мы тем самым избавляем все програм мы, пользующиеся классом Building, от необходимости выполнять это вычисление самостоятельно. Благодаря этому исключается ненужное дублирование кода. И нако нец, добавление в класс Building метода, вычисляющего площадь на одного человека, способствует улучшению его объектно-ориентированной структуры, поскольку вели чины, непосредственно связанные со зданием, инкапсулируются в классе Building.
Для того чтобы добавить метод в класс Building, достаточно указать его в обла сти объявлений в данном классе. В качестве примера ниже приведен переработанный вариант класса Building, содержащий метод AreaPerPerson, который выводит площадь, рассчитанную на одного человека в конкретном здании. // Добавить метод в класс Building. using System; class Building { public int Floors; // количество этажей public int Area; // общая площадь здания public int Occupants; // количество жильцов // Вывести площадь на одного человека, public void AreaPerPerson { Console.WriteLine(" " + Area / Occupants + " приходится на одного человека"); } } // Использовать метод AreaPerPerson. class BuildingDemo { static void Main { Building house = new Building; Building office = new Building; // Присвоить значения полям в объекте house. house.Occupants = 4; house.Area = 2500; house.Floors = 2; // Присвоить значения полям в объекте office. office.Occupants = 25; office.Area = 4200; office.Floors = 3; Console.WriteLine("Дом имеет:\n " + house.Floors + " этажа\n " + house.Occupants + " жильца\n " + house.Area + "кв. футов общей площади, из них"); house.AreaPerPerson; Console.WriteLine; Console.WriteLine("Учреждение имеет:\n " + office.Floors + " этажа\n " + office.Occupants + " работников\n " + office.Area + " кв. футов общей площади, из них"); office.AreaPerPerson; } }
Эта программа дает такой же результат, как и прежде. Дом имеет: 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 происходит возврат из метода.