- •8 Подробнее о методах и классах
- •8.1 Управление доступом к членам класса
- •8.1.1 Модификаторы доступа
- •8.1.2 Организация закрытого и открытого доступа
- •8.1.3 Практический пример организации управления доступом
- •8.2 Передача объектов методам по ссылке
- •8.2.1 Способы передачи аргументов методу
- •8.3 Использование модификаторов параметров ref и out
- •8.3.1 Использование модификатора параметра ref
- •8.3.2 Использование модификатора параметра out
- •8.3.3 Использование модификаторов ref и out для ссылок на объекты
- •8.4 Использование переменного числа аргументов
- •8.5 Возврат объектов из методов
- •8.5.1 Возврат массива из метода
- •8.6 Перегрузка методов
- •8.7 Перегрузка конструкторов
- •8.7.1 Вызов перегружаемого конструктора с помощью ключевого
- •8.8 Инициализаторы объектов
- •8.9 Необязательные аргументы
- •8.9.1 Необязательные аргументы и перегрузка методов
- •8.9.2 Необязательные аргументы и неоднозначность
- •8.9.3 Практический пример использования необязательных аргументов
- •8.10 Именованные аргументы
- •8.11 Метод Main ()
- •8.11. 1 Возврат значений из метода Main()
- •8.11.2 Передача аргументов методу Main()
- •8.12 Рекурсия
- •8.13 Применение ключевого слова static
- •8.13.1 Статические конструкторы
- •8.14 Статические классы
8.9.1 Необязательные аргументы и перегрузка методов
В некоторых случаях необязательные аргументы могут стать альтернативой перегрузке методов. Для того чтобы стало понятнее, почему это возможно, обратимся еще раз к примеру метода OptArgMeth(). До появления в C# необязательных аргументов нам пришлось бы создать три разных варианта метода OptArgMeth(), чтобы добиться таких же функциональных возможностей, как и у рассмотренного выше варианта этого метода. Все эти варианты пришлось бы объявить следующим образом.
static void OptArgMeth(int alpha)
static void OptArgMeth(int alpha, int beta)
static void OptArgMeth(int alpha, int beta, int gamma)
Эти перегружаемые варианты метода OptArgMeth() позволяют вызывать его с одним, двумя или тремя аргументами. (Если значения параметров beta и gamma не передаются, то они предоставляются в теле перегружаемых вариантов данного метода.) Безусловно, в такой реализации функциональных возможностей метода OptArgMeth() с помощью перегрузки нет ничего дурного. Но в данном случае целесообразнее все же воспользоваться необязательными аргументами, хотя такой подход не всегда оказывается более совершенным, чем перегрузка метода.
8.9.2 Необязательные аргументы и неоднозначность
При использовании необязательных аргументов может возникнуть такое затруднение, как неоднозначность. Нечто подобное может произойти при перегрузке метода с необязательными параметрами. В некоторых случаях компилятор может оказаться не в состоянии определить, какой именно вариант метода следует вызывать, когда необязательные аргументы не заданы. В качестве примера рассмотрим два следующих варианта метода OptArgMeth ().
static void OptArgMeth(int alpha, int beta=10, int gamma = 20)
{
Console.WriteLine("Это аргументы alpha, beta и gamma: " +
alpha + " " + beta + " " + gamma);
}
static void OptArgMeth(int alpha, double beta=10., double gamma =20.) {
Console.WriteLine("Это аргументы alpha, beta и gamma: " +
alpha + " " + beta + " " + gamma);
}
Обратите внимание на то, что единственное отличие в обоих вариантах рассматриваемого здесь метода состоит в типах параметров beta и gamma, которые оказываются необязательными. В первом варианте оба параметра относятся к типу int, а во втором к типу double. С учетом этих вариантов перегрузки метода OptArgMeth() следующий его вызов приводит к неоднозначности.
OptArgMeth(1); // Ошибка из-за неоднозначности!
Этот вызов приводит к неоднозначности потому, что компилятору неизвестно, какой именно вариант данного метода использовать: тот, где параметры beta и gamma имеют тип int, или же тот, где они имеют тип double. Но самое главное, что конкретный вызов метода OptArgMeth() может привести к неоднозначности, даже если она и не присуща его перегрузке.
В связи с тем что перегрузка методов, допускающих применение необязательных аргументов, может привести к неоднозначности, очень важно принимать во внимание последствия такой перегрузки. В некоторых случаях, возможно, придется отказаться от применения необязательных аргументов, чтобы исключить неоднозначность и тем самым предотвратить использование метода непреднамеренным образом.
