Страница 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("Это аргументы alpha, beta и gamma: " </b>
<b> + alpha + " " + beta + " " + 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 = "пользователь", int userid) { // Ошибка!</b>
Для исправления ошибки в этом объявлении необходимо указать аргумент userid до аргумента name. Раз уж вы начали объявлять необязательные аргументы, то указывать после них обязательные аргументы нельзя. Например, следующее объявление также оказывается неверным.
<b>int Sample(int accountld, string name = "пользователь", 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() с помощью перегрузки нет ничего дурного. Но в данном случае целесообразнее все же воспользоваться необязательными аргументами, хотя такой подход не всегда оказывается более совершенным, чем перегрузка метода.