1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 27
Текст из файла (страница 27)
Рассмотрим, например, следующий метод:public void myMeth() {int i;}for(i=0; i<10; i++) {if(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-метода может быть осуществлендвумя способами: по достижении закрывающей фигурной скобки или при выполненииинструкции return.Возврат значенияХотя void-методы — не редкость, большинство методов все же возвращаютзначение.
И в самом деле, способность возвращать значение — одно из самых полезныхкачеств метода. Мы уже рассматривали пример возврата значения методом в главе 3, когдаиспользовали метод Math.Sqrt() для получения квадратного корня.Значения, возвращаемые методами, используются в программировании по-разному. Водних случаях (как в методе Math.Sqrt()) возвращаемое значение является результатомвычислений, в других — оно просто означает, успешно или нет выполнены действия,составляющие метод, а в третьих — оно может представлять собой код состояния. Однаконезависимо от цели применения, использование значений, возвращаемых методами,является неотъемлемой частью C#-программирования.Методы возвращают значения вызывающим их процедурам, используя следующуюформу инструкции return:return значение;Здесь элемент значение и представляет значение, возвращаемое методом.Способность методов возвращать значения можно использовать для улучшенияреализации метода areaPerPerson(). Вместо того чтобы отображать значение площади,которая приходится на одного человека, метод 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 {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.
Язык C#// Присваиваем значения полям в объекте office.office.occupants = 25;office.area = 4200;office.floors = 3;// Получаем для объекта house площадь, которая// приходится на одного человека.areaPP = house.areaPerPerson();Console.WriteLine("Дом имеет:\n " +house.floors + " этажа\n " +house.occupants + " жильца\n " +house.area +" квадратных футов общей площади, из них\n " +areaPP + " приходится на одного человека");Console.WriteLine();// Получаем площадь для объекта office, которая// приходится на одного человека.areaPP = office.areaPerPerson();Console.WriteLine("Офис имеет:\n " +office.floors + " этажа\n " +office.occupants + " работников\n " +office.area +" квадратных футов общей площади, из них\n " +areaPP + " приходится на одного человека");}}Результаты выполнения этого варианта программы аналогичны предыдущим.Обратите внимание на вызов метода areaPerPerson(): его имя находится справаот оператора присваивания.
В левой части стоит переменная, которая и получает значение,возвращаемое методом areaPerPerson(). Таким образом, после выполненияинструкцииareaPP = house.areaPerPerson();значение площади, приходящейся на одного человека для объекта house, будет сохраненов переменной areaPP.Обратите также внимание на то, что метод areaPerPerson() имеет в этомпримере другой тип возвращаемого значения, а именно тип int.
Это означает, что методвозвращает автору вызова целое число. Тип значения, возвращаемого методом, — оченьважная характеристика метода, поскольку тип данных, возвращаемых методом, долженбыть совместимым с типом возвращаемого значения, указанного в заголовке определенияметода. Следовательно, если вы хотите, чтобы метод возвращал данные типа double, приего определении в качестве типа возвращаемого значения следует указать double.Несмотря на корректность предыдущей программы, ее эффективность оставляетжелать лучшего. В частности, нет необходимости в использовании переменной areaPP.Вызов метода areaPerPerson() можно реализовать непосредственно в инструкциивызова метода WriteLine();Console.WriteLine("Дом имеет:\n " +house.floors + " этажа\n " +Глава 6.
Введение в классы, объекты и методы139house.occupants + " жильца\n " +house.area + " общей площади, из них\n " +house.areaPerPerson() +" приходится на одного человека");В этом случае при вызове метода WriteLine() автоматически вызывается методhouse.areaPerPerson(), и возвращаемое им значение передается методуWriteLine(). Более того, теперь обращение к методу house.areaPerPerson()можно использовать везде, где необходимо значение площади для объекта классаBuilding, которая приходится на одного человека.
Например, в следующей инструкциисравниваются такие значения площадей двух зданий.if(b1.areaPerPerson() > b2.areaPerPerson())Console.WriteLine("В здании b1 больше места для каждого человека.");Использование параметровПри вызове методу можно передать одно или несколько значений.
Как упоминалосьвыше, значение, передаваемое методу, называется аргументом. Переменная внутри метода,которая принимает значение аргумента, называется параметром. Параметры объявляютсявнутри круглых скобок, которые следуют за именем метода. Синтаксис объявленияпараметров аналогичен синтаксису, применяемому для переменных. Параметр находится вобласти видимости своего метода, и, помимо специальной задачи получения аргумента,действует подобно любой локальной переменной.Перед вами простой пример использования метода с параметром.
В классе ChkNumопределен метод isPrime, который возвращает значение true, если переданное емузначение является простым, и значение false в противном случае. Следовательно, методisPrime возвращает значение типа bool.// Простой пример использования параметра.using System;class ChkNum {// Метод возвращает true, если x - простое число.public bool isPrime(int x) {for(int i=2; i < x/2 + 1; i++)if((x %i) == 0) return false;}}return true;class ParmDemo {public static void Main() {ChkNum ob = new ChkNum();for(int i=1; i < 10; i++)if(ob.isPrime(i)) Console.WriteLine(i +" простое число.");else Console.WriteLine(i + " не простое число.");}}Эта программа генерирует следующие результаты:140Часть I.
Язык C#123456789простое число.простое число.простое число.не простое число.простое число.не простое число.простое число.не простое число.не простое число.В этой программе метод isPrime вызывается девять раз, и каждый раз емупередается новое значение. Рассмотрим этот процесс более внимательно. Во-первых,обратите внимание на то, как происходит обращение к методу isPrime. Передаваемыйаргумент указывается между круглыми скобками. При первом вызове метода isPrime емупередается значение 1.
Перед началом выполнения этого метода параметр x получитзначение 1. При втором вызове аргумент будет равен числу 2, а значит, и параметр получитзначение 2 и т.д. Важно то, что значение, переданное как аргумент при вызове функцииisPrime, представляет собой значение, получаемое параметром x.Метод может иметь более одного параметра.
В этом случае достаточно объявитькаждый параметр, отделив его от следующего запятой. Расширим, например, уже знакомыйнам по предыдущей программе класс ChkNum, добавив в него метод lcd(), которыйвозвращает наименьший общий знаменатель (least common denominator) для двухпередаваемых ему значений.// Добавляем метод, который принимает два аргумента.using System;class ChkNum {// Метод возвращает true, если x - простое число.public bool isPrime(int x) {for(int i=2; i < x/2 + 1; i++)if((x %i) == 0) return false;return true;}// Метод возвращает наименьший общий знаменатель.public int lcd(int a, int b) {int max;if(isPrime(a) | isPrime(b)) return 1;max = a < b ? a : b;for(int i=2; i < max/2 + 1; i++)if(((a%i) == 0) & ((b%i) == 0)) return i;}}return 1;class ParmDemo {public static void Main() {ChkNum ob = new ChkNum();int a, b;for(int i=1; i < 10; i++)Глава 6.
Введение в классы, объекты и методы141if(ob.isPrime (i)) Console.WriteLine(i +" простое число.");else Console.WriteLine(i + " не простое число.");a = 7;b = 8;Console.WriteLine("Наименьший общий знаменатель для " +a + " и " + b + " равен " +ob.lcd(a, b));}}a = 100;b = 8;Console.WriteLine("Наименьший общий знаменатель для " +a + " и " + b + " равен " +ob.lcd(a, b));a = 100;b = 75;Console.WriteLine("Наименьший общий знаменатель для " +a + " и " + b + " равен " +ob.lcd(a, b));Обратите внимание на то, что при вызове метода lcd() аргументы такжеразделяются запятыми. Вот результаты выполнения этой программы:1 простое число.2 простое число.3 простое число.4 не простое число.5 простое число.6 не простое число.7 простое число.8 не простое число.9 не простое число.Наименьший общий знаменатель для 7 и 8 равен 1Наименьший общий знаменатель для 100 и 8 равен 2Наименьший общий знаменатель для 100 и 75 равен 5При передаче методу нескольких параметров каждый из них должен сопровождатьсяуказанием собственного типа, причем типы параметров могут быть различными.