Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 44
Текст из файла (страница 44)
Разумеется, никаких ограничений на применение параметров оос в одном методе не существует. С их помощью из метода можно возвратить сколько угодно фрагментов информации. Рассмотрим пример применения двух параметров оис. В этом примере программы метод назсощрасссг () выполняет две функции. Во-первых, он определяет общий множитель (кроме 1) для двух целых чисел, возвращая логическое значение стае, если у них имеется общий множитель, а иначе — логическое значение г а1зе.
И вовторых, он возвращает посредством параметров опс наименьший и наибольший общий множитель двух чисел, если таковые обнаруживаются. // Использовать два параметра опг. пзтпч зузсеш; с1азз Нпш ( /* Определить, имеется ли у числовых значений переменных х и ч общий множитель. Если имеется, то возвратить наименьший и наибольший множители посредством параметров опг. */ риь1№с ьоо1 назсощгасгог(тпс х, 1пк у, опг тпг 1еазг, опс 1пс сгеасезс) ( 1пс 1) тпс шах = х < у ? х: ут Ьоо1 Гтгвс = Ггпет 1еазг = 1) дгеагезк = 1т // Найти наименьший и наибольший общий множитель. Гог(1=2т 1 <= шах/2 + 1т 1+ь) ( 11 ( ( (уат) ==О) а ((х%1) ==О) ) ( 1г(11гзг) ( 1еазс = тт т№гзс = та1зет 1 дгеасезс = тт ) 1г(1еазс != 1) гессгп Сгпет е1зе геспгп та1зе) ) ) с1азз Оешооиг ( зсасас чогб Иатп() ( Нош оЬ = пен Нпш() т тпс 1ст, дст) Глава В.
Подробнее о методах и классах 219 1Г(оЬ.Наэсошуасгог(231, 105, оис 1сг, оиг осг) ) ( Сопео1е.Иг1ге( ъпе (" Наименьший общий множитель " + "чисел 231 и 105 равен " + 1сг)х Сопео1е.нг1сеь1пе("Наибольший общий множитель " + "чисел 231 и 105 равен " + аист)( ) е1ве Сопао1е.нг1геъкпе("Общий множитель у чисел 35 и 49 отсутствует."); 11(оь.наасошгассог(35, 51, опс 1сг, оис дсх)) ( Сопзо1е.нгхге( ъпе("Наименьший общий множитель " + "чисел 35 и 51 равен " + 1сг)х Сопео1е.иг1сеъъпе("Наибольший общий множитель " + "чисел 35 и 51 равен " + Осе)) ) е1ее Сопзо1е.Иг1се( ьпе("Общин множитель у чисел 35 и 51 отсутствует.")) Обратите внимание на то, что значения присваиваются переменным 1сг и дог в методе ма1п () до вызова метода назсошрасгог () . Если бы параметры метода назсошрассог () были типа гег, а не Опг, это привело бы к ошибке.
Данный метод возвращает логическое значение Ьгпе или га1зе, в зависимости от того, имеется ли общий множитель у двух целых чисел. Если он имеется, то посредством параметров оиь возвращаются наименьший и наибольший общий множитель этих чисел. Ниже приведен результат выполнения данной программы. Наименьший общий множитель чисел 231 и 105 равен 3 Наибольший общий множитель чисел 231 и 105 равен 21 Общий множитель у чисел 35 и 51 отсутствует. Использование модификаторов кеЕ и оис для ссылок на объекты Применение модификаторов гег и Опг не ограничивается только передачей значений обычных типов. С их помощью можно также передавать ссылки на объекты. Если модификатор гег или Оис указывает на ссылку, то сама ссылка передается по ссылке. Это позволяет изменить в методе объект, на который указывает ссылка.
Рассмотрим в качестве примера следующую программу, в которой ссылочные параметры ген служат для смены объектов, на которые указывают ссылки. О Поменять местами лве ссылки. пэ1пд Зуесеш) с1аев вегенер ( хпг а, Ь; риЬ1хс Нетэнар(1пс 1, 1пг 3) ( а = 1) 220 Часть ). йзык С» Ь=); ) рпЬ11с то10 5пои() ( Сопзо1е.Иг»се(,1пе("а: (0), Ь| (1)", а, Ы: ) // Этот метод изменяет свои аргументы. рпЬ1»с то14) 5иар(геЕ аесэиар оЫ, геЕ аегзнар оЬ2) ( КЕЕ5иар Г) Г=оЫ) оЫ = оЬ24 оЬ2 = гь ) ) с1азз аетзнарОеюо ( зсапъс то»О Ма»п() ( аегзнар х = пен аеЕзиар(1, 2); ае»виар у = пен аеЕзнар(3, 4); Сопзо1е.иг»се("х до вызова: "); х.звон()4 Сопзо1е.иг1се("у до вызова: "); у.5пон П / Сопзо1е.иг»сеъ»пе(); // Смена объектов, на которые ссылаются // аргументы х и у.
х.знар(геЕ х, геЕ у); Сопзо1е.иг»се("х после вызова: ")) х.звон(): Сопзо1е.иг1се("у после вызова: "); у.эвон()) ) При выполнении этой программы получается следующий результат: х до вызова: а: 1, Ь: 2 у до вызова". а: 3, Ь: 4 х после вызова: а: 3, Ь: 4 у после вызова: а: 1, Ь: 2 В данном примере в методе Эзар () производится смена объектов, иа которые ссылаются два его аргумента. До вызова метода 5нар () аргумент х ссылается иа объект, содержащий зиачеиия 1 и 2, тогда как аргумент у ссылается иа объект, содержащий значения 3 и 4.
А после вызова метода 5иар () аргумент х ссылается иа объект, содержащий зиачеиия 3 и 4, тогда как аргумент у ссылается иа объект, содержащий значения 1 и 2. Если бы Глава 8. Подробнее о методах и классак 221 ие параметры гег, то перестановка в методе виар () ие имела бы никаких последствий за пределами этого метода.
Для того чтобы убедиться в этом, исключите параметры гег из метода Беар () . Использование переменного числа аргументов При создании метода обычно заранее известно число аргументов, которые будут переданы ему, ио так бывает ие всегда. Иногда возникает потребность создать метод, которому можно было бы передать произвольное число аргументов.
Допустим, что требуется метод, обнаруживающий наименьшее среди ряда значений. Такому методу можно было бы передать ие менее двух, трех, четырех или еще больше значений. Но в любом случае метод должен возвратить наименьшее из этих значений. Такой метод нельзя создать, используя обычные параметры. Вместо этого придется воспользоваться специальным типом параметра, обозначаюшим произвольное число параметров. И это делается с помошью создаваемого параметра типа рагавв. Для объявления массива параметров, способного принимать от нуля до нескольких аргументов, служит модификатор рагавв. Число элементов массива параметров будет равно числу аргументов, передаваемых методу.
А для получения аргументов в программе организуется доступ к данному массиву. Ниже приведен пример программы, в которой модификатор рагавв используется для СОЗдаНИя МЕтОда МЬПт/а1 (), ВОЗВраШаЮШЕГО НаИМЕНЬШЕЕ Срсдп ряда ЗадаННЫХ ЗНаЧЕНИй. // Продемонстрировать применение модиеикатора рагавв. пахни яувселс с1авв Мхп ( роЬ11< хпс М1пуа1(рагавв хпс[) повв) ( ).пг вт 1Е(пива.ьепок)т == 0) ( Сопво1е.кг[кеЬ1пе("Ошибка: нет аргументов."); гегпгп От ) в = пива(0)т Гог(гпс 1=1т х < поев.ьепдспт 1++) гт(поев[1[ < в) в = спмв[1)т гегпгп вт ) <1авв Рагаввпево ( всастс но1б Ма1п() ( М1П ОЬ = Пви МХП()т 1пс вхпт 1пг а = 10, Ь Г 20т 222 часть (, язык Сз // Вызвать метод с двумя значениями.
шхп = оЬ.М1пЧа1(а, Ь) т Сопзо1е.Игхгевхпе("Наименьшее значение равно " + шхп)т // Вызвать метод с тремя значениями. шхп = оЬ.М1пЧа1(а, Ь, -1)т Сопзо1е.Игвгеввпе("Наименьшее значение равно " + шхп) // Вызвать метод с пятью значениями. шхп = оЬ.МтпЧа1(18, 23, 3, 14, 25)т сопзо1е.иг1геьхпе("наименьшее значение равно " + ш1п)т // Вызвать метод с массивом целых значений. 1пс[) агчз = ( 45, 67, 34, 9, 112, 8 )т шгп = оЬ.М1пЧа1(агчв)т Сопзо1е.нг1сеЬВпе("Наименьшее значение равно " + ш1п) ) При выполнении этой программы получается следующий результат: Наименьшее значение равно 10 Наименьшее значение равно -1 Наименьшее значение равно 3 Наименьшее значение равно 8 Всякий раз, когда вызывается метод М1пЧа1 (), ему передаются аргументы в массиве пцшз. Длина этого массива равна числу передаваеМых аргументов.
Поэтому с помощью метода М1пЧа1 () можно обнаружить наименьшее среди любого числа значений. Обратите внимание на последний вызов метода мапча1 () . Вместо отдельных значений в данном случае передается массив, содержащий ряд значений. И такая передача аргументов вполне допустима. Когда создается параметр типа рагашз, он воспринимает список аргументов переменной длины или же массив, содержащий аргументы. Несмотря на то что параметру типа рагашз может быть передано любое число аргументов, все они должны иметь тип массива, указываемый этим параметром. Например, вызов метода М1пЧа1 () шхп = оЬ.МхпЧа1(1, 2.2) т // Ошибка! считается недопустимым, поскольку нельзя автоматически преобразовать тип боцЬ1е (значение 2.2) в тип 1пс, указанный для массива пцшз в методе м1пча1 () .
Пользоваться модификатором рагашз следует осторожно, соблюдая граничные условия, так как параметр типа рагашз может принимать любое число аргументов — даже нулевое! Например, вызов метода М1пЧа1 () в приведенном ниже фрагменте кода считается правильным с точки зрения синтаксиса С№. шхп = оЬ.МтпЧа1()т // нет аргументов шхп = оЬ.МтпЧа1(3)т // 1 аргумент Именно поэтому в методе м1пуа1() организована проверка на наличие в массиве пцшз хотя бы одного элемента перед тем, как пытаться получить доступ к этому элементу.
Если бы такой проверки не было, то при вызове метода Мзпча1 () без аргументов возникла бы исключительная ситуация во время выполнения. (Подробнее об исключительных Глава 8. Подробнее о методах н классах 223 ситуациях речь пойдет в главе (3.) Более того, код метода Мгпуа1 () написан таким образом, чтобы его можно было вызывать с одним аргументом. В этом случае возвращается этот единственный аргумент. У метода могут быть как обычные параметры, так и параметр переменной длины, В качестве примера ниже приведена программа, в которой метод Яьонйтдя () принимает один параметр типа ясгдпд, а также целочисленный массив в качестве параметра типа рагащв.
// Испольэовать обычный параметр вместе с параметром // переменной длины типа ратащв. ця1пд Яувселц с1авв Мус1аяв ( роЬ11с чо1б ЯЬоийхдв(вкх1пд щвд, рахащв 1пк(] пцщв) ( Сопво1е.иг1ке(щвд + ": ") т Гохеасй(1пс х 1п поев) сопяо1е.иххье(1 ь " ")т сопяо1е.ихгкеьвпе()т ) с1аяя Ракащярещо2 ( всак1с чо1б Маьп() ( МуС1аяя оЬ = пен МуС1аяв()т оЬ.ЯЬоиАхдв("Это ряд целых чисел", 1, 2, 3, 4, 5)т оЬ.ЯЬоийхдв("й это еще два целых числа 17, 20)т Вот какой результат дает выполнение этой программы: Это ряд целых чисел: 1, 2, 3, 4, 5 А это еще два целых числа: 17, 20 В тех случаях, когда у метода имеются обычные параметры, а также параметр переменной длины типа рагащя, он должен быть указан последним в списке параметров данного метода.