
- •Глава 9. Методы с#
- •9.1. Методы-процедуры и методы-функции
- •9.2. Соотношение фиксированных параметров и аргументов
- •9.3. Параметры с типами ссылок
- •1 4 8 2 4 9 3
- •1 2 3 4 4 8 9
- •1 4 9 16 25 36
- •9.4. Методы с переменным числом аргументов
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •9.7. Применение метода Array.Sort()
1 4 9 16 25 36
В программе метод (функция) newAr(), получив в качестве аргумента целое неотрицательное значение, создаёт одномерный целочисленный массив, присваивает его элементам значения и возвращает в точку вызова ссылку на сформированный массив. В методе Main() определена переменная-ссылка vector на целочисленный массив и ей присвоен результат вызова метода newAr(). Результаты выполнения программы иллюстрируют сказанное.
9.4. Методы с переменным числом аргументов
У параметра с модификатором params назначение особое - он представляет в методе список аргументов неопределённой (заранее не фиксированной) длины. Его тип - одномерный массив с элементами типа, указанного в спецификации параметра.
Как уже сказано, этот параметр может быть только последним (или единственным) в списке параметров. В обращении к методу этот параметр заменяется списком аргументов, каждый из которых должен иметь тот же тип, что и элементы массива параметров. В теле метода отдельные реально использованные аргументы представлены элементами массива-параметра. Количество аргументов соответствует длине массива.
В качестве примера приведём программу с методом для вычисления значений полинома Pn(x)=a0*xn+ai*xn-1+...+an-i*x+an:
// 09_12.cs - массив-параметр
// Вычисляет значение полинома с целыми коэффициентами:
static double polynom(double x, params int [] coef)
{
double result = 0.0;
for (int i = 0; i < coef.Length; i++)
result = result * x + coef[i]; return result;
}
static void Main()
{
Console.WriteLine(polynom(3.0, 3, 1, 2));
}
Результат выполнения программы:
32
Метод polynom() возвращает значение типа double, то есть играет роль функции. Первый параметр double x представляет значение аргумента полинома. Второй параметр params int [] coef даёт возможность передать в метод список коэффициентов полинома a0, ai, .. an-i, an. Все коэффициенты должны иметь целочисленные значения. Их реальное количество, то есть степень полинома, при обращении определяется числом использованных аргументов, а в теле метода - значением поля coef.Length. В теле метода:
coef[0]=a0, coef[1]= ai, ..., coef[n]=an.
Для вычисления полинома использована схема Горнера, позволяющая заменить явные возведения в степень последовательными умножениями: Pn(x)=(...( a0*x+ a1)*x+a2)*x+...+ an-i)*x+ an
В том случае, когда требуется метод, принимающий произвольное число параметров любых разных типов, Дж. Рихтер [10] предлагает использовать параметр вида params Object[]. Он приводит в качестве примера метод, который выводит обозначения (наименования) типов всех переданных методу аргументов. Вот программа с этим методом:
// 09_13.cs - массив-параметр "универсального" типа
// Метод выводит названия типов аргументов:
static void DisplayTypes(params Object[] objects)
{ foreach (Object o in objects)
Console.WriteLine(o.GetType());
}
static void Main09_13()
{ DisplayTypes("yes", 432, new Object()); }
Результат выполнения программы:
System.String
System.Int32
System.Object
Обратим внимание, что параметр, снабжённый модификатором params, обеспечивает передачу аргументов по значению, т.е. значения аргументов после выполнения метода не изменяются. Следующая программа иллюстрирует это правило.
// 09_14.cs - переменное число аргументов
static void varParams(params int[] var)
{
for (int i = 0; i < var.Length; i++)
{
var[i] *= 2;
Console.Write("var[{0}]={1} ", i, var[i]);
}
}
static void Main()
{ int a = 2, b = 3, с = 5;
varParams(a, b, с);
Console.WriteLine("\na={0}, b={1}, c={2}", a, b, с);
}
Результат выполнения программы:
var[0]=4 var[1]=6 var[2] = 10
a = 2, b=3, c=5
Значения переменных a, b, с после их использования в качестве аргументов метода varParams() не изменились, хотя в теле метода элементы массива-параметра присвоены новые значения.