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

Страница 106 из 502

Принимая во внимание приведенное выше объявление метода OptArgMeth(), последний можно вызвать следующими способами.

<b>// Передать все аргументы явным образом.</b>

<b>OptArgMeth(1, 2, 3);</b>

<b>// Сделать аргумент gamma необязательным.</b>

<b>OptArgMeth(1, 2);</b>

<b>// Сделать оба аргумента beta и gamma необязательными.</b>

<b>OptArgMeth(1);</b>

При первом вызове параметру alpha передается значение 1, параметру beta — значение 2, а параметру gamma — значение 3. Таким образом, все три аргумента задаются явным образом, а значения, устанавливаемые по умолчанию, не используются. При втором вызове параметру alpha передается значение 1, а параметру beta — значение 2, но параметру gamma присваивается устанавливаемое по умолчанию значение 20. И наконец, при третьем вызове упомянутого выше метода параметру alpha передается значение 1, а параметрам beta и gamma присваиваются устанавливаемые по умолчанию значения. Следует, однако, иметь в виду, что параметр beta не получит устанавливаемое по умолчанию значение, если то же самое не произойдет с параметром gamma. Если первый аргумент устанавливается по умолчанию, то и все остальные аргументы должны быть установлены по умолчанию.

Весь описанный выше процесс демонстрируется в приведенном ниже примере программы.

<b>// Продемонстрировать необязательные аргументы.</b>

<b>using System;</b>

<b>class OptionArgDemo {</b>

<b>  static void OptArgMeth(int alpha, int beta=10, int gamma = 20) {</b>

<b>     Console.WriteLine(&quot;Это аргументы alpha, beta и gamma: &quot; </b>

<b>            + alpha + &quot; &quot; + beta + &quot; &quot; + gamma);</b>

<b>  }</b>

<b>  static void Main() {</b>

<b>    // Передать все аргументы явным образом.</b>

<b>    OptArgMeth(1, 2, 3);    <i>i</i></b>

<b><i>    //</i> Сделать аргумент gamma необязательным.</b>

<b>    OptArgMeth(1, 2);</b>

<b>    // Сделать оба аргумента beta и gamma необязательными.</b>

<b>    OptArgMeth(1);</b>

<b>  }</b>

<b>}</b>

Результат выполнения данной программы лишь подтверждает применение используемых по умолчанию аргументов.

<b>Это аргументы alpha, beta и gamma: 1 2 3</b>

<b>Это аргументы alpha, beta и gamma: 1 2 20</b>

<b>Это аргументы alpha, beta и gamma: 1 10 20</b>

Как следует    из приведенного выше результата, если аргумент не указан, то используется его значение, устанавливаемое по умолчанию.

Следует иметь в виду, что все необязательные аргументы должны непременно указываться справа от обязательных. Например, следующее объявление оказывается недействительным.

<b>int Sample(string name = &quot;пользователь&quot;, int userid) { // Ошибка!</b>

Для исправления ошибки в этом объявлении необходимо указать аргумент userid до аргумента name. Раз уж вы начали объявлять необязательные аргументы, то указывать после них обязательные аргументы нельзя. Например, следующее объявление также оказывается неверным.

<b>int Sample(int accountld, string name = &quot;пользователь&quot;, int userid) { //.Ошибка!</b>

Аргумент name объявляется как необязательный, и поэтому аргумент userid следует указать до аргумента name (или же сделать его также необязательным).

Помимо методов, необязательные аргументы можно применять в конструкторах, индексаторах и делегатах. (Об индексаторах и делегатах речь пойдет далее в этой книге.)

Преимущество необязательных аргументов заключается, в частности, в том, что они упрощают программирующему обращение со сложными вызовами методов и конструкторов. Ведь нередко в методе приходится задавать больше параметров, чем обычно требуется. И в подобных случаях некоторые из этих параметров могут быть сделаны необязательными благодаря аккуратному применению необязательных аргументов. Это означает, что передавать нужно лишь те аргументы, которые важны в данном конкретном случае, а не все аргументы, которые в противном случае должны быть обязательными. Такой подход позволяет рационализировать метод и упростить программирующему обращение с ним.

В некоторых случаях необязательные аргументы могут стать альтернативой перегрузке методов. Для того чтобы стало понятнее, почему это возможно, обратимся еще раз к примеру метода OptArgMeth(). До появления в C# необязательных аргументов нам пришлось бы создать три разных варианта метода OptArgMeth(), чтобы добиться таких же функциональных возможностей, как и у рассмотренного выше варианта этого метода. Все эти варианты пришлось бы объявить следующим образом.

<b>static void    OptArgMeth(int alpha)</b>

<b>static void    OptArgMeth(int alpha, int beta)</b>

<b>static void    OptArgMeth(int alpha, int beta, int gamma)</b>

Эти перегружаемые варианты метода OptArgMeth() позволяют вызывать его с одним, двумя или тремя аргументами. (Если значения параметров beta и gamma не передаются, то они предоставляются в теле перегружаемых вариантов данного метода.) Безусловно, в такой реализации функциональных возможностей метода OptArgMeth() с помощью перегрузки нет ничего дурного. Но в данном случае целесообразнее все же воспользоваться необязательными аргументами, хотя такой подход не всегда оказывается более совершенным, чем перегрузка метода.