Формальные параметры (или просто параметры) – это данные, с которыми работает подпрограмма. Параметры перечисляются в заголовке подпрограммы в определённой последовательности и с указанием типов.
Список может содержать фиксированное число аргументов, разделяемых запятой – для подпрограммы с параметрами или быть пустым – для подпрограммы без параметров.
Синтаксис объявления двух параметров:
[ ref | out | params] тип_аргумента1 имя_аргумента1,
тип_аргумента2 имя_аргумента2;
Например: (out long p1, int p2);
Параметры связаны с аргументами. Аргументы – данные, передаваемые в подпрограмму или возвращаемые из нее. Это внешние для подпрограммы данные, с которыми имеет дело вызывающая часть программы. В подпрограмме им соответствуют параметры. Указываются в списке аргументов при обращении к подпрограмме и являются фактическими параметрами.
Можно для фиксированного числа формальных параметров передать методу произвольное число фактических аргументов. Для этого в списке формальных параметров необходимо задать ключевое слово params. Оно может появляться в объявлении лишь последнего аргумента списка, объявленного как массив произвольного типа. При вызове метода этому параметру соответствует произвольное число фактических аргументов.
Для аргументов и параметров необходимо соблюдать:
- одинаковое количество;
- одинаковый порядок следования;
- совместимость типов;
- одинаковый статус аргументов (если параметр объявлен с ключевым словом ref или out, то фактический аргумент должен сопровождаться таким же ключевым словом в точке вызова).
Все формальные параметры разделяются на 3 группы:
- входные параметры – задаются без ключевого слова (или с параметром ref); передают информацию методу и их значения в теле метода только читаются;
- выходные параметры – снабжаются ключевым словом out; представляют собой результаты метода, они получают значения в ходе работы метода; в теле метода должен присутствовать оператор присваивания, задающий значение этому параметру;
- обновляемые параметры – снабжаются ключевым словом ref; выполняют обе функции. Их значения используются в ходе вычислений и обновляются в результате работы метода.
Например:
// Процедура Cube
void Cube(out long p2, int p1)
{
p2 = (long)Math.Pow(p1, 3);
Console.WriteLine(“Метод 1”);
}
// Процедура CubeM
void CubeM(out double p2, params double[ ] p)
{
p2 =0; for (int I = 0; I < p.lehgth; i++)
p2 + = Math.Pow(p[ i ], 3);
Console.WriteLine(“Метод 2”);
}
// Функция F
int F(ref int a)
{
retun (a++)
}
Все методы закрыты, поскольку объявлены без модификатора доступа. Cube и CubeM – процедуры, а F – функция. Аргумент р2 – является выходным (сопровождается ключевым словом out ), поэтому в теле метода ему присваивается значение. Аргумент функции F является обновляемым (снабжен ключевым словом ref ), в теле функции используется его значение для получения результата функции, но и само значение параметра изменяется в теле функции. Для процедуры CubeM используется ключевое слово params для самого последнего аргумента р. Т.к. этому параметру будет соответствовать несколько фактических аргументов, число которых может быть произвольным.