Г. Шилдт - С#4.0 Полное руководство (1160795), страница 47
Текст из файла (страница 47)
ьпп Башр1е(зпгьпд паше = "пользопатель", ьпг пзег16( ( /( Ошибка! Для исправления ошибки в этом объявлении необходимо указать аргумент па ег1с( до аргумента паше. Раз уж вы начали объявлять необязательные аргументы, то указывать после них обязательные аргументы нельзя. Например, следукзщее объявление также оказывается неверным. ьпп Яшпр1е(ьпп ассоопп10, ппг1пе паше = "пользователь", ьпп опег1б( ( !/ Ошибка! Аргумент паше объявляется как необязательный, и поэтому аргумент пзег1с( следует указать до аргумента паше (или же сделать его также необязательным). Помимо методов, необязательные аргументы можно применять в конструкторах, индексаторах и делегатах.
(Об индексаторах и делегатах речь пойдет далее в этой книге.) Преимущество необязательных аргументов заключается, в частности, в том, что они упрощают программирующему обращение со сложными вызовами методов и конструкторов. Ведь нередко в методе приходится задавать больше параметров, чем обычно требуется. И в подобных случаях некоторые из этих параметров могут быть сделаны необязательными благодаря аккуратному применению необязательных аргументов.
Это означает, что передавать нужно лишь те аргументы, которые важны в данном конкретном случае, а не все аргументы, которые в противном случае должны быть обязательными. Такой подход позволяет рационализировать метод и упростить программирующему обращение с ним. Необязательные аргументы н перегрузка методов В некоторых случаях необязательные аргументы могут стать альтернативой перегрузке методов. Для того чтобы стало понятнее, почему это возможно, обратимся еще 250 часть!.
язык С() раз к примеру метода ОрглгоыеСЬ () . До появления в СЗ необязательных аргументов нам пришлось бы создать три разных варианта метода ОрслгоМеСЬ (), чтобы добиться таких же функциональных возможностей, как и у рассмотренного выше варианта этого метода. Все эти варианты пришлось бы объявить следующим образом. яяая1о чо1д ОрСАгонеяв(хпя а1рЬя) ягвгьо чоьд Орялгпнеяь(1пя а1рвв, ьпг Ьега) всаг1с чо1д Орслгэнесь(1пя в1рвя, ьпг Ьеса, гпс дашка) Эти перегружаемые варианты метода ОрбАгдМеЬЬ () позволяют вызывать его с одним, двумя или тремя аргументами.
(Если значения параметров Ьеса и дашша не передаются, то они предоставляются в теле перегружаемых вариантов данного метода.) Безусловно, в такой реализации функциональных возможностей метода Орглгдыесп () с помощью перегрузки нет ничего дурного. Но в данном случае целесообразнее все же воспользоваться необязательными аргументами, хотя такой подход не всегда оказывается более совершенным, чем перегрузка метода.
Необязательные аргументы и неоднозначность При использовании необязательных аргументов может возникнуть такое затруднение, как неоднозначность. Нечто подобное может произойти при перегрузке метода с необязательными параметрами. В некоторых случаях компилятор может оказаться не в состоянии определить, какой именно вариант метода следует вызывать, когда необязательные аргументы не заданы. В качестве примера рассмотрим два следующих варианта метода ОрСАгдыесЬ ( ) .
вгвсьс чо1д ОРГАгчиесв(гпя а1РЬа, Япс Ъеяа=10, ьпс Чашша = 20) ( Сопяо1е.Хгяяесьпе ("Это аргументы а1рвв, Ьеяа и Чвшшв: а1рвя е " " + Ьеяа + " " е Чашша); ) вгагьо чоьд Оргкгчмеяь(ьпг а1рьа, дооЪ1е Ьегя=10.0, дооьге двшшя = 20.0) ( Сопво1е.игьгевьпе("Это аргументы в1рвв, Ьеяа и двшшя: в1рьв з " " е ьеса е " " э чяяяяя)г ) Обратите внимание на то, что единственное отличие в обоих вариантах рассматриваемого здесь метода состоит в типах параметров Ьеса и дапнпа, которые оказываются необязательными. В первом варианте оба параметра относятся к типу 1пс, а во втором — к типу донЬ1е. С учетом этих вариантов перегрузки метода ОрСАгдыеСЬ () следующий его вызов приводит к неоднозначности.
ОрялгЧМеПЬ(1); !/ Ошибка из-зв неоднозначности! Этот вызов приводит к неоднозначности потому, что компилятору неизвестно, какой именно вариант данного метода использовать: тот, где параметры ьеьа и дашин имеют тип 10г, или же тот, где они имеют тип донЬ1е. Но самое главное, что конкретный вызов метода Орслгггыегп () может привести к неоднозначности, даже если она и не присуща его перегрузке. В связи с тем что перегрузка методов, допускающих применение необязательных аргументов, может привести к неоднозначности, очень важно принимать во внимание последствия такой перегрузки.
В некоторых случаях, возможно, придется отказаться от применения необязательных аргументов, чтобы исключить неоднозначность и тем самым предотвратить использование метода непреднамеренным образом. Глава 8. Подробнее о методах н классах 251 Практический пример использования необязательных аргументов Для того чтобы показать на практике, насколько необязательные аргументы упрощают вызовы некоторых типов методов, рассмотрим следующий пример программы.
В этой программе объявляется метод 01зр1ау (), выводящий на экран символьную строку полностью или частично. Использовать необязательный аргумент, чтобы упростить вызов метода. ивьпд яузгею; с1авв озеоргкгпв ( Вывести на экран символьную строку полностью или частично. вгагьс чо10 01зр1ау(вгг1по вгг, гпг всагг = О, 1пг втор = -1) 11(егор < О) егор = всг.ьепясьг // проверить условие выхода за заданные пределы. 11(егор > эгг.ьепогл ) всагс > асор ( всагг < О) гесчгпг гог(1пг ь=вгагю 1 < вгорг Сопво1е.ильге(згг(1))Г Сопво1е.нгьгеЬьпе(); ) зсас1с но16 Ма1п() Ььар1ау("это простой тест"); Ргвр1ау("это простой тест", 12)1 01вр1ау("это простой тест", 4, 14); ) Выполнение этой программы дает следующий результат.
это простой тест тест простой те Внимательно проанализируем метод ()1зр1ау () . Выводимая на экран снмвольнай строка передается в первом аргументе данного метода. Зто обязательный аргумент, а два других аргумента — необязательные. Они задают начальный и конечный индексы для вывода части символьной строки. Если параметру асор не передается значение, то по умолчанию он принимает значение — 1, указывающее на то, что конечной точкой вывода служит конец символьной строки.
Если же параметру з с а ге не передается значение, то по умолчанию он принимает значение О. Следовательно, в отсутствие одного из необязательных аргументов символьная строка выводится на экран полностью. В противном случае она выводится на экран частично. Зто означает, что если вызвать метод г)1зр1ау () с одним аргументом (т.е. с выводимой строкой), то символьная строка будет выведена на экран полностью. Если же вызвать метод Рьвр1ау () с двумя аргументами, то на экран будут выведены символы, начиная с позиции, определяемой аргументом 252 Часть Е Язык Св зсагс, и до самого конца строки. А если вызвать метод Пйвр1ау () с тремя аргументами, то на экран будут выведены символы из строки, начиная с позиции, определяемой аргументом вгагс, и заканчивая позицией, определяемой аргументом егор.
Несмотря на всю простоту данного примера, он, тем не менее, демонстрирует значительное преимущество, которое дают необязательные аргументы. Это преимущество заключается в том, что при вызове метода можно указывать только те аргументы, которые требуются. А передавать явным образом устанавливаемые по умолчанию значения не нужно. Прежде чем переходить к следующей теме, остановимся на следующем важном моменте. Необязательные аргументы оказываются весьма эффективным средством лишь в том случае, если они используются правильно. Они предназначены для того, чтобы метод выполнял свои функции эффективно, а пользоваться им можно было бы просто и удобно.
В этом отношении устанавливаемые по умолчанию значения всех аргументов должны упрощать обычное применение метода. В противном случае необязательные аргументы способны нарушить структуру кода и ввести в заблуждение тех, кто им пользуется. И наконец, устанавливаемое по умолчанию значение необязательного параметра не должно наносить никакого вреда. Иными словами, неумышленное использование необязательного аргумента не должно приводить к необратимым, отрицательным последствиям. Так, если забыть указать аргумент при вызове метода, то это не должно привести к удалению важного файла данных! Именованные аргументы Еще одним средством, связанным с передачей аргументов методу, является именованный аргуменги. Именованные аргументы были внедрены в версии С)) 4.0.