Необязательные аргументы
В версии С# 4.0 внедрено новое средство, повышающее удобство указания аргументов при вызове метода. Это средство называется необязательными аргументами и позволяет определить используемое по умолчанию значение для параметра метода. Данное значение будет использоваться по умолчанию в том случае, если для параметра не указан соответствующий аргумент при вызове метода. Следовательно, указывать аргумент для такого параметра не обязательно. Необязательные аргументы позволяют упростить вызов методов, где к некоторым параметрам применяются аргументы, выбираемые по умолчанию. Их можно также использовать в качестве "сокращенной" формы перегрузки методов. Применение необязательного аргумента разрешается при создании необязательного параметра. Для этого достаточно указать используемое по умолчанию значение параметра с помощью синтаксиса, аналогичного инициализации переменной. Используемое по умолчанию значение должно быть константным выражением. В качестве примера рассмотрим следующее определение метода.
static void OptArgMeth(int alpha, int beta=10, int gamma = 20) {}
В этой строке кода объявляются два необязательных параметра: beta и gamma, причем параметру beta по умолчанию присваивается значение 10, а параметру gamma — значение 20. Эти значения используются по умолчанию, если для данных параметров не указываются аргументы при вызове метода. Следует также иметь в виду, что параметр alpha не является необязательным. Напротив, это обычный параметр, для которого всегда нужно указывать аргумент. Принимая во внимание приведенное выше объявление метода OptArgMeth (), последний можно вызвать следующими способами. // Передать все аргументы явным образом. OptArgMeth(1, 2, 3); // Сделать аргумент gamma необязательным. OptArgMeth(1, 2); // Сделать оба аргумента beta и gamma необязательными. OptArgMeth(1); При первом вызове параметру alpha передается значение 1, параметру beta - значение 2, а параметру gamma - значение 3. Таким образом, все три аргумента задаются явным образом, а значения, устанавливаемые по умолчанию, не используются. При втором вызове параметру alpha передается значение 1, а параметру beta - значение 2, но параметру gamma присваивается устанавливаемое по умолчанию значение 20. И наконец, при третьем вызове упомянутого выше метода параметру alpha передается значение 1, а параметрам beta и gamma присваиваются устанавливаемые по умолчанию значения. Следует, однако, иметь в виду, что параметр beta не получит устанавливаемое по умолчанию значение, если то же самое не произойдет с параметром gamma. Если первый аргумент устанавливается по умолчанию, то и все остальные аргументы должны быть установлены по умолчанию. Весь описанный выше процесс демонстрируется в приведенном ниже примере программы. // Продемонстрировать необязательные аргументы.
using System;
class OptionArgDemo { static void OptArgMeth(int alpha, int beta=10, int gamma = 20) { Console.WriteLine("Here is alpha, beta, and gamma: " + alpha + " " + beta + " " + gamma); }
static void Main() { // Передать все аргументы явным образом. OptArgMeth(1, 2, 3);
// Сделать аргумент gamma необязательным. OptArgMeth(1, 2);
// Сделать оба аргумента beta и gamma необязательными. OptArgMeth(1); } }
Результат выполнения данной программы лишь подтверждает применение используемых по умолчанию аргументов. Это аргументы alpha, beta и gamma: 12 3 Это аргументы alpha, beta и gamma: 1 2 20 Это аргументы alpha, beta и gamma: 1 10 20
Как следует из приведенного выше результата, если аргумент не указан, то используется его значение, устанавливаемое по умолчанию. Следует иметь в виду, что все необязательные аргументы должны непременно указываться справа от обязательных. Например, следующее объявление оказывается недействительным. int Sample(string name = "пользователь", int userId) { // Ошибка! Для исправления ошибки в этом объявлении необходимо указать аргумент userId до аргумента паше. Раз уж вы начали объявлять необязательные аргументы, то указывать после них обязательные аргументы нельзя. Например, следующее объявление также оказывается неверным. int Sample(int accountld, string name = "пользователь", int userId) { //Ошибка! Аргумент name объявляется как необязательный, и поэтому аргумент userId следует указать до аргумента паше (или же сделать его также необязательным). Помимо методов, необязательные аргументы можно применять в конструкторах, индексаторах и делегатах. Преимущество необязательных аргументов заключается, в частности, в том, что они упрощают программирующему обращение со сложными вызовами методов и конструкторов. Ведь нередко в методе приходится задавать больше параметров, чем обычно требуется. И в подобных случаях некоторые из этих параметров могут быть сделаны необязательными благодаря аккуратному применению необязательных аргументов. Это означает, что передавать нужно лишь те аргументы, которые важны в данном конкретном случае, а не все аргументы, которые в противном случае должны быть обязательными. Такой подход позволяет рационализировать метод и упростить программирующему обращение с ним.
Именованные аргументы Еще одним средством, связанным с передачей аргументов методу, является именованный аргумент . Именованные аргументы были внедрены в версии C# 4.0. Как вам должно быть уже известно, при передаче аргументов методу порядок их следования, как правило, должен совпадать с тем порядком, в котором параметры определены в самом методе. Иными словами, значение аргумента присваивается параметру по его позиции в списке аргументов. Данное ограничение призваны преодолеть именованные аргументы. Именованный аргумент позволяет указать имя того параметра, которому присваивается его значение. И в этом случае порядок следования аргументов уже не имеет никакого значения. Таким образом, именованные аргументы в какой-то степени похожи на упоминавшиеся ранее инициализаторы объектов, хотя и отличаются от них своим синтаксисом. Для указания аргумента по имени служит следующая форма синтаксиса. имя_параметра : значение Здесь имя_параметра обозначает имя того параметра, которому передается значение . Разумеется, имя_параметра должно обозначать имя действительного параметра для вызываемого метода. Ниже приведен простой пример, демонстрирующий применение именованных аргументов. В этом примере создается метод IsFactor(), возвращающий логическое значение true, если первый его параметр нацело делится на второй параметр. Листинг 8.26 // Применить именованные аргументы.
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); Вообще говоря, комбинация именованных и необязательных аргументов позволяет упростить вызовы сложных методов со многими параметрами. Синтаксис именованных аргументов более многословен, чем у обычных позиционных аргументов, и поэтому для вызова методов чаще всего применяются позиционные аргументы. Но в тех случаях, когда это уместно, именованные аргументы могут быть использованы довольно эффективно. Помимо методов, именованные и необязательные аргументы могут применяться в конструкторах, индексаторах и делегатах.
Популярное: Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (162)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |