Г. Шилдт - С#4.0 Полное руководство (1160795), страница 48
Текст из файла (страница 48)
Как вам должно быть уже известно, при передаче аргументов методу порядок их следования, как правило, должен совпадать с тем порядком, в котором параметры определены в самом методе. Иными словами, значение аргумента присваивается параметру по его позиции в списке аргументов. Данное ограничение призваны преодолеть именованные аргументы.
Именованный аргумент позволяет указать имя того параметра, которому присваивается его значение. И в этом случае порядок следования аргументов уже не имеет никакого значения. Таким образом, именованные аргументы в какой-то степени похожи на упоминавшиеся ранее инициализаторы объектов, хотя и отличаются от них своим синтаксисом. Для указания аргумента по имени служит следующая форма синтаксиса. имя лараметре : значение Здесь имя параметра обозначает имя того параметра, которому передается зна— чение.
Разумеется, имя параметра должно обозначать имя действительного параметра для вызываемого метода. Ниже приведен простой пример, демонстрирующий применение именованных аргументов. В этом примере создается метод 1зГассог (), возвращающий логическое значение Стае, если первый его параметр нацело делится на второй параметр. Применить именованные аргументы. овгпч зузсеьо става Наиеоягсвоеио ( Глава 8. Подробнее о методах н классах 253 // Выяснить, делится ли одно значение нацело на другое. *Гаогс )зоо1 1згассог(гпс ча1, гпс бгчгзог) ( 11((ча1 % О1нтзог) == О) гесигп Ггие1 гегигп Еа1зе1 ) зсао1с чогд Ма1п() Ниже демонстрируются разные способы вызова метода 1зтассог() вызов с использованием позиционных аргументов. гт(1зтассог(10, 2)) Сопзо1е.нг1сещпе("2 — множитель 10.")) Вызов с использованием именованных аргументов.
11(1втассог(ча1: 10, бгчгзог: 2)) Сопзо1е.Хггсеьтпе("2 — множитель 10.") 1 // Лля именованного аргумента порядок указания не имеет значения. 11(1зтассог(01чгзог: 2, на1: 10)) Сопво1е.нгггегдпе("2 — множитель 10.")( Применить как позиционный, так и именованный аргумент. 11(1зтассог(10, г(1ч1вог: 2)) Сопзо1е.нггсевдпе("2 — множитель 10.") 1 Выполнение этого кода дает следующий результат. 2 — множитель 10. 2 — множитель 10. 2 — множитель 10. 2 — множитель 10. Как видите, при каждом вызове метода 1зрастог () получается один и тот же результат. Помимо демонстрации именованного аргумента в действии, приведенный выше пример кода иллюстрирует две важные особенности именованных аргументов.
Во-первых, порядок следования аргументов не имеет никакого значения. Например, два следующих вызова метода 1з Расгог П совершенно равнозначны. гатассог(ча1 :10, Жчтзог: 2) 1зтассог(и(1чгвог: 2, нат: 10) Независимость от порядка следования является главным преимуществом именованных аргументов. Это означает, что запоминать (или даже знать) порядок следования параметров в вызываемом методе совсем не обязательно. Для работы с СОМ- интерфейсами это может быть очень удобно. И во-вторых, позиционные аргументы можно указывать вместе с именованными в одном и том же вызове, как показано в следующем примере.
1зтассог(10, Огчгзог: 2) Следует, однако, иметь в виду, что при совместном использовании именованных и позиционных аргументов все позиционные аргументы должны быть указаны перед любыми именованными аргументами. 254 Часть!. Язык С() Именованные аргументы можно также применять вместе с необязательными аргументами. Покажем это на примере вызова метода 01яр1ау (), рассматривавшегося в предыдущем разделе. // Указать все аргументы по имени. щяр1ау(ягор: 10, ягг: "зто простой тест", яоагп: О) // Сделать аргумент всагс устанавливаемым по умолчанию. рьяр1ау(ягор: 10, ягг: "зто простой тест"); уу указать строку по позиции, аргумент асор — по имени Ьу пане, уу тогда как аргумент яоагг — устанавливаемым по умолчанию 01вр1ау("зто простой тест", явор: 10)г Вообще говоря, комбинация именованных и необязательных аргументов позволяет упростить вызовы сложных методов со многими параметрами.
Синтаксис именованных аргументов более многословен, чем у обычных позиционных аргументов, и поэтому для вызова методов чаще всего применяются позиционные аргументы. Но в тех случаях, когда это уместно, именованные аргументы могут быть использованы довольно эффективно. ПРИМЕЧАНИЕ Помимо методов, именованные и необязательные аргументы могут применяться в конструкторах, индексаторах и делегатах.
(Об иидексаторах и делегатах речь пойдет далее а этой книге.) Метод Ма3.п () В представленных до сих пор примерах программ использовалась одна форма метода Мадп () . Но у него имеется также целый ряд перегружаемых форм. Одни из них могут служить для возврата значений, другие — для получения аргументов. В этом разделе рассматриваются и те и другие формы.
Возврат значений из метода Майлз () По завершении программы имеется возможность возвратить конкретное значение из метода Маьп () вызывающему процессу (зачастую операционной системе). Для этой цели служит следующая форма метода Мадп () . ягагьс тпо Магп() Обратите внимание на то, что в этой форме метода ма1п () объявляется возвращаемый тип 1пс вместо типа гоп). Как правило, значение, возвращаемое методом Мауп ( ), указывает на нормальное завершение программы или на аварийное ее завершение из-за сложившихся ненормальных условий выполнения.
Условно нулевое возвращаемое значение обычно указывает на нормальное завершение программы, а все остальные значения обозначают тип возникшей ошибки. Глава 8. Подробнее о методах н вассах 255 Передача ар(ументов методу Ма1п () Многие программы принимают так называемые аргументы команднои строки, т.е, информацию, которая указывается в командной строке непосредственно после имени программы при ее запуске на выполнение. В программах на С(( такие аргументы передаются затем методу Маьп () .
Для получения аргументов служит одна из приведенных ниже форм метода Ма1п ( ) . ягясгс уогс( Нагп(ягг1пд[ ] агдя) всвггс гпс ма1п(ясг1пд[ ] агдв) В первой форме метод Мадп () возвращает значение типа уодп, а во второй — целое значение, как пояснялось выше. Но в обеих формах аргументы командной строки сохраняются в виде символьных строк в массиве типа я с г1пд, который передается методу Ма1п () .
Длина этого массива (агдв) должна быть равна числу аргументов командной строки, которое может быть и нулевым. В качестве примера ниже приведена программа, выводящая все аргументы командной строки, вместе с которыми она вызывается. Вывести все аргументы командной строки. оядпд Яуягево с1аяя СЬОеиа ( ясаг1с яогс Магп(ягг1пд(] агдя) ( сопяо1е.нггсеьгпе("командная строка содержит агдя.ьепдг)г е аргумента."); Сопяо1е.иг1гевьпе("Вот они: ")Г гог(гпг 1=0г 1 < агдя.ьепдгь; Сопяо1е.нгггепгпе(агдя[1]); Если программа С],пеио запускается из командной строки следующим образом: СЬОеио один двв три то ее выполнение дает такой результат. Командная строка содержит 3 аргумента. вот они: один два три Для того чтобы стало понятнее, каким образом используготся аргументы командной строки, рассмотрим еще один пример программы, в которой применяется простой подстановочный шифр для шифровки или расшифровки сообщений.
Шифруемое или расшифровываемое сообщение указывается в командной строке. Применяемый шифр действует довольно просто. Для шифровки слова значение каждой его буквы инкрементируется на 1. Следовательно, Буква "А" становится буквой "Б" и т.д. А для расшифровки слова значение каждой его буквы декрементируется на 1. Разумеется, такой шифр не имеет никакой практической ценности, поскольку его нетрудно разгадать. Тем не менее он может стать приятным развлечением для детей. 256 Часть ). язык С(т Зашифровать и расшифровать сообщение, используя простой подстановочный шифр. ояьпч Зуявеш; с1аяя Сарьег япао1с 1пг Маьп(япг1пд[) агяя) ( // Проверить наличие аргументов. 11(агсв.ьепдгь < 2) ( Сопяо1е.нг1геЬ1пе("ПРИМЕНЕНИЕ: "слово1: <зашифровать>/<расшифровать> г... Н)"); гевпгп 1; // возвратить код неудачного завершения программы ) Если аргументы присутствуют, то первым аргументом должно быть // слово <зашифровать> или же слово <расшифровать>.
11(агэя[0) (= "зашифровать" Я агчя[0] )= "расшифровать" ) Сопяо1е.игьгеЬЬпе("Первым аргументом должно быть слово "<зашифровать> или <расшифровать>."); гепогп 1; // возвратить код неудачного завершения программы ) Зашифровать или расшифровать сообщение. гог(1пс п=1; и < агдя.ьепчсь| и++) ( гог(1пг 1=0; 1 < агчя(п).Ьепдоь; 1+Н 11(агре[0) == "зашифровать") Сопяо)е.игьте((сваг) (агчя[п)[1) ь 1) ) е1яе Сопяо1е.Ильге((сваг) (агся[п)[1) — 1) ) Сопяо1е.нг1ое (" "); Сопяо1е.игьпеЬ1пе()г гесогп От Для того чтобы воспользоваться этой программой, укажите в командной строке имя программы, затем командное слово "зашифровать" или "расшифровать" и далее сообщение, которое требуется зашифровать или расшифровать. Ниже приведены два примера выполнения данной программы, при условии, что она называется Сьрпег. С: (01рвег ваююфровать один два пейо егб С:(01ркег расмяфровать аейо егб один два Данная программа отличается двумя интересными свойствами.
Во-первых, обратите внимание на то, как в ней проверяется наличие аргументов командной строки перед тем, как продолжить выполнение. Это очень важное свойство, которое можно Глава 8. Подробнее о ыетодах н классах 257 обобщить. Если в программе принимается во внимание наличие одного или более аргументов командной строки, то в ней должна быть непременно организована проверка факта передачи ей предполагаемых аргументов, иначе программа будет работать неправильно. Кроме того, в программе должна быть организована проверка самих аргументов перед тем, как продолжить выполнение.