Г. Шилдт - С#4.0 Полное руководство (1160795), страница 42
Текст из файла (страница 42)
Для начала рассмотрим простой пример. В приведенной ниже программе создается метод Бцг (), возвращающий вместо своего аргумента квадрат его целочисленного значения. Обратите особое внимание на применение и местоположение модификатора геТ. // использовать модификатор гег для передачи значения обычного типа по ссылке. ов1пд Бувгеьм с1азв Вегтевя ( // Этот метод изменяет свой аргумент.
Обратите внимание на применение модификатора гег. рнЬ11с чогб Бог(тег ьнс 1) ( * 1; ) ) с1авв Кегоезо ( вгаг1с чотб Маьд() ( йеттевг оЬ = лен Кегтевг()т 1пс а = 10; солво1е.игтьеььле("а до вызова. "" + а) оЬ.Бог(гег а); // обратите внимание на применение модификатора гег Солво1е.нгьяеъьне("а после вызова: " + а) ) ) Как видите, модификатор ге Т указывается перед объявлением параметра в самом методе и перед аргументом при вызове метода. Ниже приведен результат выполнения данной программы, который подтверждает, что значение аргумента а действительно было изменено с помощью метода Бс) г ( ) .
а до вызова: 10 а после вызова: 100 224 Часть (. Язык С(г Теперь, используя модификатор ге1, можно написать метод переставляющий местами значения двух своих аргументов простого типа. В качестве примера ниже приведена программа, в которой метод Яиар () выполняет перестановку значений двух своих целочисленных аргументов, когда он вызывается. Поменять местами два значения. пягпэ Яуясев; с1аяя уа1оеЯнар ( Этот метод меняет местами свои аргументы. рпьггс хогг) 5яар(геГ гпс а, геГ 1пп Ь) гпг г.; а; а=Ь; Ь ) ) с1аяя Уа1пеэнароево ( ясас1с чо10 На1п() ( Уа1оезнар оЬ = пен Уа1пеэнар() гпс х = 10, у = 20; сопяо1е.игггешпе("х и у до вызова: " + х + " " + у); оЬ.Янар(геГ х, гет у); Сопяо1е.нггсеЬгпе("х и у после вызова: " + х + " " + у); ) ) Вот к какому результату приводит выполнение этой программы.
х и у до вызова: 10 20 х и у после вызова: 20 10 В отношении модификатора гег необходимо иметь в виду следующее. Аргументу, передаваемому по ссылке с помощью этого модификатора, должно быль присвоено значение до вызова метода. Дело в том, что в методе, получающем такой аргумент в качестве параметра, предполагается, что параметр ссылается на действительное значение. Следовательно, при использовании модификатора гег в методе нельзя задать первоначальное значение аргумента. Использование модификатора параметра ои~ Иногда ссылочный параметр требуется использовать для получения значения из метода, а не для передачи ему значения.
Допустим, что имеется метод выполняющий некоторую функцию, например, открытие сетевого сокета и возврат кода успешного или неудачного завершения данной операции в качестве ссылочного параметра. В этом случае методу не передается никакой информации, но в то же время он должен возвратить определенную информацию. Главная трудность при этом состоит в том, Глава 8. Подробнее о методах и классах 225 что параметр типа ге1 должен быть инициализирован определенным значением до вызова метода. Следовательно, чтобы воспользоваться параметром типа ге Е, придется задать для аргумента фиктивное значение и тем самым преодолеть данное ограничение. Правда, в СФ имеется более подходящий вариант выхода из подобного затруднения — воспользоваться модификатором параметра оцб. Модификатор параметра оцс подобен модификатору сей, за одним исключением: он служит только для передачи значения за пределы метода.
Поэтому переменной, используемой в качестве параметра оцс, не нужно (да и бесполезно) присваивать какое-то значение. Более того, в методе параметр оцб считается ненни((иализированным, т.е. предполагается, что у него отсутствует первоначальное значение. Это означает, что значение должно быть присвоено данному параметру в методе до его завершения.
Следовательно, после вызова метода параметр оцс будет содержать некоторое значение. Ниже приведен пример применения модификатора параметра оцс. В этом примере программы для разделения числа с плавающей точкой на целую и дробную части используется метод Себрагба () из класса Оесощрове. Обратите внимание на то, как возвращается каждая часть исходного числа. !/ использовать модификатор параметра оцс. цвгпч зувгещ( с1аав Оесощроае 2* Разделить числовое значение с плавающей точкой на целую и дробную части. */ рцЬ11с хпг оеСРаггв(боцЬ1е и, оцг боцЬ1е Ггас) ьпг вбо1е( вбо1е = (1пт) и; Глас = и — иЬо1ег /! передать дробную часть числа через параметр Ггас гесцгп вЬо1е; // возвратить целую часть числа с1авв Овебцв ( ввавьс уоьб Нахп() Оесощроае оЬ = пен Оесощрове() ьпс боцбзе об.беСРагта(10. 125, оцв Сопво1е.нгьвевьпе("Целая часть числа равна Сопво1е.нггвеьгпе("Дробная часть числа равна ) ) Выполнение этой программы дает следующий результат.
Целая часть числа равна 10 Дробная часть числа равна 0.125 226 Часть (. Язык С() Метод Веграггв () возвращает два фрагмента информации. Во-первых, целую часть исходного числового значения переменной и обычным образом с помощью оператора гессгп. И во-вторых, дробную часть этого значения посредством параметра вегас типа опт. Как показывает данный пример, используя модификатор параметра опт, можно организовать возврат двух значений из одного и того же метода.
Разумеется, никаких ограничений на применение параметров опт в одном методе не существует. С их помощью из метода можно возвратить сколько угодно фрагментов информации. Рассмотрим пример применения двух параметров опт. В этом примере программы метод НавСошрасгог () выполняет две функции. Во-первых, он определяет общий множитель (кроме 1) для двух целых чисел, возвращая логическое значение стае, если у них имеется общий множитель, а иначе — логическое значение уа1ее. И во-вторых,.он возвращает посредством параметров типа опс наименьший и наибольший общий множитель двух чисел, если таковые обнаруживаются.
// Использовать два параметра типа оис. ов1пч Зуясещг с1аяя Нпщ ( /* Определить, имеется ли у числовых значений переменных х и ч общий множитель. Если имеется, то'возвратить наименьший и наибольший множители посредством параметров типа опс. */ рпЬ1гс Ьоо1 Назоошгассог(тпс х, 1пс у, опс 1пв 1еазт, очг 1пс чгеасезс) ( 1пг гг ьпс щах = х < у ? х '- уг Ьоо1 11гвг = ггоег 1еаяс = 1г дгеавевт = 1г Найти наименьший и наибольший общий множитель. Гог(1 2г г < шах/2 + 1; 1++) ( гг ( ((у%1) ==О) ь ((хь).) ==О) ) ( 11(тггвг) ( 1еавг = ).г Гггвг = Га1вег ) дгеасевг = ьг ) 11(1еавс != 1) геспгп Ггоег е1ве гегогп Га1яег ) ) с1авв оещоопс ( вгаг1с чогб Нагп() ( Ниш оЬ = пеи Нпш()г 1пв 1ст, уст) 1г(оЬ.Навоощгассог(231, 105, опт 1ст, опп дст)) ( Глава 8. Подробнее о методах и классах 227 Сопяс1е.нтттеььпе("Наименьший общий множитель "чисел 231 и 105 равен " + 1ст); сопяс1е.хг1геь1пе("наибольший общий мйожитель "чисел 231 и 105 равен " + дст); ) е1яе сопяо1е.хт1геь1пе("Общий множитель у чисел 35 и 49 отсутствует.") 11(оЬ.Наясошрастсг(35, 51, опт 1сс, опт чст)) ( Сопяо1е.нг1теъгпе("Наименьший общий множитель "чисел 35 и 51 равен " + 1сг)г Сопяо1е.нгттеътпе("Наибольший общий множитель "чисел 35 и 51 равен " + чст)) ) е1яе Сспяо1е.нт1те11пе("Общий множитель у чисел 35 и 51 отсутствует.") Обратите внимание на то, что значения присваиваются переменным 1СГ и ест в методе Маьп () до вызова метода НаяСощт асгог () .
Если бы параметры метода НаяСощрасгог () были типа гег, а не опт, это привело бы к ошибке. Данный метод возвращает логическое значение ггпе или га1яе, в зависимости от того, имеется ли общий множитель у двух целых чисел. Если он имеется, то посредством параметров типа ошб возвращаются наименьший и наибольший общий множитель этих чисел. Ниже приведен результат выполнения данной программы. Наименьший общий множитель чисел 231 и 105 равен 3 Наибольший общий множитель чисел 231 и 105 равен 21 Общий множитель у чисел 35 и 51 отсутствует. Использование модификаторов ген и оис для ссылок на объекты Применение модификаторов ген и ООГ не ограничивается только передачей значений обычных типов.
С их помощью можно также передавать ссылки на объекты. Если модификатор гей или опг указывает на ссылку, то сама ссылка передается по ссь|лке. Это позволяет изменить в методе объект, на который указывает ссылка. Рассмотрим в качестве примера следующую программу, в которой ссылочные параметры типа ге 1 служат для смены объектов, на которые указывают ссылки.
!/ Поменять местами Лве ссылки. пагад Яуягеач с1аяя Несянар ( тпт а, Ь; рпЬ1тс Нетянар(тпт 1, 1пт 3) ( а=я; Ь= 3: ) 228 Часть (. Язык С№ роЬ11с чего 5ьон() ( Сопяо1е.ыгтсеюпе("а: (0), Ь: (1)"„ а, Ь); ) Этот метод изменяет свои аргументы. роЫтс чотб Янар(гет Ветзиар оЫ, гет аетзнар оЬ2) ( яетзиар гг Г = оЬ1; оЫ = оЬ24 ОЬ2 ) ) с1аяя Кетзиарпеюо ( ясасгс чо15 Мати() ( аег"Беар х = пеи аетзиар(1, 2); Кетзиар у = пеи Кетзиар(3, 4); сопяо1е.нг1ге("х до вызова: "); х.
Явои (); Сопяо1е.ыгьге("у до вызова: "); у.звон (); Сопяо1е.кг1сеюпе() // Смена объектов, на которые ссылаются аргументы х и у. х.Яиар(гет х, гет у); Сопяо1е.ыгтсе("х после вызова: ") х.ЯЬои(); Сопяо1е.нгтсе("у после вызова: ")) у.звон(); ) ) При выполнении этой программы получается следующий результат. х до вызова: а: 1, Ь: 2 у до вызова: а: 3, Ь: 4 х после вызова: а: 3, Ь: 4 у после вызова: а: 1, Ь: 2 В данном примере в методе Беар () выполняется смена объектов, на которые ссылаются два его аргумента.
До вызова метода Биар () аргумент х ссылается на объект, содержащий значения 1 и 2, тогда как аргумент у ссылается на объект, содержащий значения 3 и 4. А после вызова метода Быар () аргумент х ссылается на объект, содержащий значения 3 и 4, тогда как аргумент у ссылается на объект, содержащий значения 1 и 2. Если бы не параметры типа гег, то перестановка в методе Быар () не имела бы никаких последствий за пределами этого метода. Для того чтобы убедиться в этом, исключите параметры типа ге г из метода Беар () .
Глава 8. Подробнее о методах и кяассах 229 Использование переменного числа аргументов При создании метода обычно заранее известно число аргументов, которые будут переданы ему, но так бывает не всегда. Иногда возникает потребность создать метод, которому можйо было бы передать произвольное число аргументов. Допустим, что требуется метод, обнаруживающий наименьшее среди ряда значений. Такому методу можно было бы передать не менее двух, трех, четырех или еще больше значений.