Выбрать главу

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

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

Именованные аргументы

Еще одним средством, связанным с передачей аргументов методу, является именованный аргумент. Именованные аргументы были внедрены в версии 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(vaclass="underline" 10, divisor: 2))

Console.WriteLine("2 - множитель 10.");

// Для именованного аргумента порядок указания не имеет значения, if(IsFactor(divisor: 2, vaclass="underline" 10))

Console.WriteLine("2 - множитель 10.");

// Применить как позиционный, так и именованный аргумент, if(IsFactor(10, divisor: 2))

Console.WriteLine("2 - множитель 10.");

}

}

Выполнение этого кода дает следующий результат.

2 - множитель 10.

2 - множитель 10.

2 - множитель 10.

2 - множитель 10.

Как видите, при каждом вызове метода IsFactor () получается один и тот же результат.