Г. Шилдт - Полный справочник по C# (1160789), страница 27
Текст из файла (страница 27)
Методa r e a P e r P e r s o n () возвращает значение типа void, т.е. не возвращает никакого значения. Эта строка завершается открывающей фигурной скобкой, за которой должнонаходиться тело метода.Так и есть. Тело метода a r e a P e r P e r s o n () состоит из единственной инструкции:Console.WriteLine("" + a r e a / occupants +11приходится на одного ч е л о в е к а " ) ;IЭта инструкция отображает площадь здания, которая приходится на одного человека, путем деления значения переменной a r e a на значение переменной occupants.Поскольку каждый объект типа Building имеет собственную копию значений a r e a иoccupants, то при вызове метода a r e a P e r P e r s o n () в вычислении площади здания,которая приходится на одного человека, будут использоваться копии этих переменных, принадлежащие конкретному вызывающему объекту.Метод a r e a P e r P e r s o n () завершается закрывающей фигурной скобкой, т.е.
приобнаружении закрывающей фигурной скобки управление программой передается вызывающему объекту.Теперь рассмотрим внимательнее строку кода из метода Main ( ) :I house.areaPerPerson();Эта инструкция вызывает метод a r e a P e r P e r s o n () для объекта house. Как видите,для этого используется имя объекта, за которым следует оператор "точка". При вызове метода управление выполнением программы передается телу метода, а после егозавершения управление возвращается автору вызова, и выполнение программы возобновляется со строки кода, которая расположена сразу за вызовом метода.В данном случае в результате вызова h o u s e .
a r e a P e r P e r s o n () отображается значение площади, которая приходится на одного человека, для здания, определенногообъектом house. Точно так же в результате вызова of f i c e . a r e a P e r P e r s o n () отображается значение площади, которая приходится на одного человека, для здания,136Часть I.
Язык С#определенного объектом office. Другими словами, каждый раз, когда вызывается метод areaPerPersonO, отображается значение площади, которая приходится на одного человека, для здания, описываемого заданным объектом.Обратите внимание вот на что. Переменные экземпляра area и occupants используются внутри метода areaPerPersonO без каких бы то ни было атрибутов, т.е.им не предшествует ни имя объекта, ни оператор "точка". Это очень важный момент:если метод задействует переменную экземпляра, которая определена в его классе, онделает это напрямую, без явной ссылки на объект и без оператора "точка". И это логично. Ведь метод всегда вызывается для некоторого объекта конкретного класса.
Иесли уж вызов состоялся, объект, стало быть, известен. Таким образом, нет необходимости указывать внутри метода объект во второй раз. Это значит, что значения area иoccupants внутри метода areaPerPersonO неявно указывают на копии этих переменных, принадлежащих объекту, который вызывает метод areaPerPerson ().Возвращение из методаВ общем случае существует два варианта условий для возвращения из метода. Первый связан с обнаружением закрывающей фигурной скобки, обозначающей конец тела метода (как продемонстрировано на примере метода areaPerPersonO). Второйвариант состоит в выполнении инструкции r e t u r n . Возможны две формы использования инструкции r e t u r n : одна предназначена для void-методов (которые не возвращают значений), а другая — для возврата значений.
В этом разделе мы рассмотримпервую форму, а в следующем — вторую.Немедленное завершение void-метода можно организовать с помощью следующейформы инструкции r e t u r n :I return;При выполнении этой инструкции управление программой передается автору вызова метода, а оставшийся код опускается. Рассмотрим, например, следующий метод:p u b l i c void myMethO {int i ;for(i=0;i f ( i == 5) return; / / Прекращение выполнения/ / метода при i = 5.Console.WriteLine();Здесь цикл for будет работать при значениях i в диапазоне только от 0 до 5, поскольку, как только значение i станет равным 5, будет выполнен возврат из методаmyMeth().Метод может иметь несколько инструкций return. Например, выход из методаpublic void myMeth () {if(done) return;//...if(error) return;}произойдет либо в случае его корректного завершения, либо при возникновенииошибки.
Однако наличие слишком большого количества точек выхода из метода может деструктурировать код. Поэтому, несмотря на допустимость их множественногоприменения, следует все же использовать эту возможность с большой осторожностью.Глава 6. Введение в классы, объекты и методы137Итак, завяжем "узелок на память": выход из void-метода может быть осуществлендвумя способами: по достижении закрывающей фигурной скобки или при выполнении инструкции r e t u r n .Возврат значенияХотя void-методы — не редкость, большинство методов все же возвращают значение.
И в самом деле, способность возвращать значение — одно из самых полезныхкачеств метода. Мы уже рассматривали пример возврата значения методом в главе 3,когда использовали метод Math. Sqrt () для получения квадратного корня.Значения, возвращаемые методами, используются в программировании поразному. В одних случаях (как в методе Math. S q r t ( ) ) возвращаемое значение является результатом вычислений, в других — оно просто означает, успешно или нет выполнены действия, составляющие метод, а в третьих — оно может представлять собойкод -состояния. Однако независимо от цели применения, использование значений,возвращаемых методами, является неотъемлемой частью С#-программирования.Методы возвращают значения вызывающим их процедурам, используя следующуюформу инструкции r e t u r n :return значение;Здесь элемент значение и представляет значение, возвращаемое методом.Способность методов возвращать значения можно использовать для улучшенияреализации метода a r e a P e r P e r s o n {).
Вместо того чтобы отображать значение площади, которая приходится на одного человека, метод a r e a P e r P e r s o n () будет теперьвозвращать это значение, которое можно использовать в других вычислениях. В следующем примере представлен модифицированный вариант метода a r e a P e r P e r s o n ( ) ,который возвращает значение площади, приходящейся на одного человека, а не отображает его (как в предыдущем варианте).// Демонстрация возврата значения методом areaPerPerson().using System;class Building {public i n t floors;// количество этажейpublic i n t area;// общая площадь зданияpublic i n t occupants; // количество жильцов// Возврат значения площади, которая// приходится на одного человека,public i n t areaPerPerson() {return area / occupants;// Использование значения от метода areaPerPerson().class BuildingDemo {public static void Main() {Building house = new Building();Building office = new Building();int areaPP; // Площадь, которая приходится// на одного человека.// Присваиваем значения полям в объекте house.house.occupants = 4;house.area = 2500;house.floors = 2;138Часть I.
Язык С#// Присваиваем значения полям в объектеo f f i c e . o c c u p a n t s = 25;o f f i c e . a r e a = 4200;o f f i c e . f l o o r s = 3;office,// Получаем для объекта house площадь, которая// приходится на одного человека..areaPP = h o u s e . a r e a P e r P e r s o n ( ) ;Console.WriteLine("Дом имеет:\n " +h o u s e .
f l o o r s + " этажа\п " +house.occupants + " жильца\п " +house.area +" квадратных футов общей площади, из них\пareaPP + " приходится на одного человека");Console.WriteLine();// Получаем площадь для объекта o f f i c e ,// приходится на одного человека..котораяareaPP = o f f i c e . a r e a P e r P e r s o n ( ) ;Console.WriteLine("Офис имеет:\n " +o f f i c e . f l o o r s + " этажа\п " +o f f i c e .
o c c u p a n t s + " работников\п " +office.area +" квадратных футов общей площади, из них\п " +areaPP + " приходится на одного человека");Результаты выполнения этого варианта программы аналогичны предыдущим.Обратите внимание на вызов метода areaPerPerson (): его имя находится справаот оператора присваивания. В левой части стоит переменная, которая и получает значение, возвращаемое методом areaPerPerson (). Таким образом, после выполненияинструкцииI areaPP = h o u s e .
a r e a P e r P e r s o n ( ) ;значение площади, приходящейся на одного человека для объекта house, будет сохранено в переменной areaPP.Обратите также внимание на то, что метод areaPerPerson () имеет в этом примере другой тип возвращаемого значения, а именно тип i n t . Это означает, что методвозвращает автору вызова целое число.
Тип значения, возвращаемого методом, —очень важная характеристика метода, поскольку тип данных, возвращаемых методом,должен быть совместимым с типом возвращаемого значения, указанного в заголовкеопределения метода. Следовательно, если вы хотите, чтобы метод возвращал данныетипа double, при его определении в качестве типа возвращаемого значения следуетуказать double.Несмотря на корректность предыдущей программы, ее эффективность оставляетжелать лучшего.