Добавить в цитаты Настройки чтения

Страница 53 из 188

это простой тесттестпростой теВнимательно проанализируем метод Display(). Выводимая на экран символьнаястрока передается в первом аргументе данного метода. Это обязательный аргумент, адва других аргумента — необязательные. Они задают начальный и конечный индексыдля вывода части символьной строки. Если параметру stop не передается значение, топо умолчанию он принимает значение -1, указывающее на то, что конечной точкой вывода служит конец символьной строки. Если же параметру start не передается значение, то по умолчанию он принимает значение 0. Следовательно, в отсутствие одного изнеобязательных аргументов символьная строка выводится на экран полностью. В противном случае она выводится на экран частично. Эго означает, что если вызвать методDisplay() с одним аргументом (т.е. с выводимой строкой), то символьная строка будетвыведена на экран полностью. Если же вызвать метод Display() с двумя аргументами,то на экран будут выведены символы, начиная с позиции, определяемой аргументомstart, и до самого конца строки. А если вызвать метод Display() с тремя аргументами, то на экран будут выведены символы из строки, начиная с позиции, определяемойаргументом start, и заканчивая позицией, определяемой аргументом stop.Несмотря на всю простоту данного примера, он, тем не менее, демонстрирует значительное преимущество, которое дают необязательные аргументы. Это преимущество заключается в том, что при вызове метода можно указывать только те аргументы,которые требуются. А передавать явным образом устанавливаемые по умолчанию значения не нужно.Прежде чем переходить к следующей теме, остановимся на следующем важном моменте. Необязательные аргументы оказываются весьма эффективным средством лишьв том случае, если они используются правильно. Они предназначены для того, чтобыметод выполнял свои функции эффективно, а пользоваться им можно было бы простои удобно. В этом отношении устанавливаемые по умолчанию значения всех аргументов должны упрощать обычное применение метода. В противном случае необязательные аргументы способны нарушить структуру кода и ввести в заблуждение тех, ктоим пользуется. И наконец, устанавливаемое по умолчанию значение необязательногопараметра не должно наносить никакого вреда. Иными словами, неумышленное использование необязательного аргумента не должно приводить к необратимым, отрицательным последствиям. Так, если забыть указать аргумент при вызове метода, то этоне должно привести к удалению важного файла данных!## Именованные аргументыЕще одним средством, связанным с передачей аргументов методу, является именованный аргумент. Именованные аргументы были внедрены в версии C# 4.0. Как вамдолжно быть уже известно, при передаче аргументов методу порядок их следования,как правило, должен совпадать с тем порядком, в котором параметры определены всамом методе. Иными словами, значение аргумента присваивается параметру по егопозиции в списке аргументов. Данное ограничение призваны преодолеть именованныеаргументы. Именованный аргумент позволяет указать имя того параметра, которомуприсваивается его значение. И в этом случае порядок следования аргументов уже неимеет никакого значения. Таким образом, именованные аргументы в какой-то степенипохожи на упоминавшиеся ранее инициализаторы объектов, хотя и отличаются отних своим синтаксисом.Для указания аргумента по имени служит следующая форма синтаксиса.

имя_параметра : значениеЗдесь имя_параметра обозначает имя того параметра, которому передается значение. Разумеется, имя_параметра должно обозначать имя действительного параметра для вызываемого метода.Ниже приведен простой пример, демонстрирующий применение именованныхаргументов. В этом примере создается метод IsFactor(), возвращающий логическоезначение true, если первый его параметр нацело делится на второй параметр.

// Применить именованные аргументы.using System;

class NamedArgsDemo { // Выяснить, делится ли одно значение нацело на другое. static bool IsFactor(int val, int divisor) { if((val % divisor) == 0) return true; return false; } static void Main() { // Ниже демонстрируются разные способы вызова метода IsFactor(). // Вызов с использованием позиционных аргументов. if(IsFactor(10, 2)) Console.WriteLine("2 - множитель 10."); // Вызов с использованием именованных аргументов. if(IsFactor(val; 10, divisor: 2)) Console.WriteLine("2 - множитель 10."); // Для именованного аргумента порядок указания не имеет значения. if(IsFactor(divisor: 2, val: 10)) Console.WriteLine("2 - множитель 10."); // Применить как позиционный, так и именованный аргумент. if(IsFactor(10, divisor: 2)) Console.WriteLine("2 - множитель 10."); }}Выполнение этого кода дает следующий результат.

2 - множитель 10.2 - множитель 10.2 - множитель 10.2 - множитель 10.Как видите, при каждом вызове метода IsFactor() получается один и тот жерезультат.Помимо демонстрации именованного аргумента в действии, приведенный вышепример кода иллюстрирует две важные особенности именованных аргументов.Во-первых, порядок следования аргументов не имеет никакого значения. Например,два следующих вызова метода IsFactor() совершенно равнозначны.



IsFactor(val :10, divisor: 2)IsFactor(divisor: 2, val: 10)Независимость от порядка следования является главным преимуществом именованных аргументов. Это означает, что запоминать (или даже знать) порядок следования параметров в вызываемом методе совсем не обязательно. Для работы с СОМ-интерфейсами это может быть очень удобно. И во-вторых, позиционные аргументыможно указывать вместе с именованными в одном и том же вызове, как показано вследующем примере.

IsFactor(10, divisor: 2)Следует, однако, иметь в виду, что при совместном использовании именованныхи позиционных аргументов все позиционные аргументы должны быть указаны передлюбыми именованными аргументами.Именованные аргументы можно также применять вместе с необязательными аргументами. Покажем это на примере вызова метода Display(), рассматривавшегося впредыдущем разделе.

// Указать все аргументы по имени.Display(stop: 10, str: "это простой тест", start: 0);// Сделать аргумент start устанавливаемым по умолчанию.Display(stop: 10, str: "это простой тест");// Указать строку по позиции, аргумент stop — по имени by name,// тогда как аргумент start — устанавливаемым по умолчаниюDisplay("это простой тест", stop: 10);Вообще говоря, комбинация именованных и необязательных аргументов позволяетупростить вызовы сложных методов со многими параметрами.Синтаксис именованных аргументов более многословен, чем у обычных позиционных аргументов, и поэтому для вызова методов чаще всего применяются позиционныеаргументы. Но в тех случаях, когда это уместно, именованные аргументы могут бытьиспользованы довольно эффективно.**ПРИМЕЧАНИЕ**Помимо методов, именованные и необязательные аргументы могут применятьсяв конструкторах, индексаторах и делегатах. (Об индексаторах и делегатах речь пойдет далеев этой книге.)## Метод Main()В представленных до сих пор примерах программ использовалась одна форма метода Main(). Но у него имеется также целый ряд перегружаемых форм. Одни из нихмогут служить для возврата значений, другие — для получения аргументов. В этомразделе рассматриваются и те и другие формы.#### Возврат значений из метода Main()По завершении программы имеется возможность возвратить конкретное значениеиз метода Main() вызывающему процессу (зачастую операционной системе). Для этойцели служит следующая форма метода Main().

static int Main()Обратите внимание на то, что в этой форме метода Main() объявляется возвращаемый тип int вместо типа void.Как правило, значение, возвращаемое методом Main(), указывает на нормальноезавершение программы или на аварийное ее завершение из-за сложившихся ненормальных условий выполнения. Условно нулевое возвращаемое значение обычно указывает на нормальное завершение программы, а все остальные значения обозначаюттип возникшей ошибки.### Передача аргументов методу Main()Многие программы принимают так называемые аргументы командной строки,т.е. информацию, которая указывается в командной строке непосредственно послеимени программы при ее запуске на выполнение. В программах на C# такие аргументы передаются затем методу Main(). Для получения аргументов служит одна из приведенных ниже форм метода Main().