- •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.3 Практический пример использования необязательных аргументов
Для того чтобы показать на практике, насколько необязательные аргументы упрощают вызовы некоторых типов методов, рассмотрим следующий пример программы. В этой программе объявляется метод Display(), выводящий на экран символьную строку полностью или частично.
Листинг 8.25
//Использовать необязательный аргумент, чтобы упростить вызов метода.
using System;
class UseOptArgs
{
// Вывести на экран символьную строку полностью или частично.
static void Display(string str, int start = 0, int stop = -1)
{
if(stop < 0)
stop = str.Length;
// Проверить условие выхода за заданные пределы.
if(stop > str.Length | start > stop | start < 0)
return;
for(int i=start; i < stop; i++)
Console.Write(str[i]);
Console.WriteLine();
}
static void Main() {
Display("это простой тест");
Display("это простой тест ", 10);
Display("это простой тест st", 5, 12);
}
}
Выполнение этой программы дает следующий результат.
это простой тест
тест
простой те
Внимательно проанализируем метод Display(). Выводимая на экран символьная строка передается в первом аргументе данного метода. Это обязательный аргумент, а два других аргумента необязательные. Они задают начальный и конечный индексы для вывода части символьной строки. Если параметру stop не передается значение, то по умолчанию он принимает значение -1, указывающее на то, что конечной точкой вывода служит конец символьной строки. Если же параметру start не передается значение, то по умолчанию он принимает значение 0. Следовательно, в отсутствие одного из необязательных аргументов символьная строка выводится на экран полностью. В противном случае она выводится на экран частично. Это означает, что если вызвать метод Display() с одним аргументом (т.е. с выводимой строкой), то символьная строка будет выведена на экран полностью. Если же вызвать метод Display() с двумя аргументами, то на экран будут выведены символы, начиная с позиции, определяемой аргументом start, и до самого конца строки. А если вызвать метод Display() с тремя аргументами, то на экран будут выведены символы из строки, начиная с позиции, определяемой аргументом start, и заканчивая позицией, определяемой аргументом stop.
Несмотря на всю простоту данного примера, он, тем не менее, демонстрирует значительное преимущество, которое дают необязательные аргументы. Это преимущество заключается в том, что при вызове метода можно указывать только те аргументы, которые требуются. А передавать явным образом устанавливаемые по умолчанию значения не нужно.
Прежде чем переходить к следующей теме, остановимся на следующем важном моменте. Необязательные аргументы оказываются весьма эффективным средством лишь в том случае, если они используются правильно. Они предназначены для того, чтобы метод выполнял свои функции эффективно, а пользоваться им можно было бы просто и удобно. В этом отношении устанавливаемые по умолчанию значения всех аргументов должны упрощать обычное применение метода. В противном случае необязательные аргументы способны нарушить структуру кода и ввести в заблуждение тех, кто им пользуется. И наконец, устанавливаемое по умолчанию значение необязательного параметра не должно наносить никакого вреда. Иными словами, неумышленное использование необязательного аргумента не должно приводить к необратимым, отрицательным последствиям. Так, если забыть указать аргумент при вызове метода, то это не должно привести к удалению важного файла данных!
