Формальные и фактические параметры

Формальные параметры (или просто параметры) – это данные, с которыми работает подпрограмма. Параметры перечисляются в заголовке подпрограммы в определённой последовательности и с указанием типов.

Список может содержать фиксированное число аргументов, разделяемых запятой – для подпрограммы с параметрами или быть пустым – для подпрограммы без параметров.

Синтаксис объявления двух параметров:

[ 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 для самого последнего аргумента р. Т.к. этому параметру будет соответствовать несколько фактических аргументов, число которых может быть произвольным.

5.14.3. Области действия имён.

Структура подпрограммы идентична структуре программы.

Имена, объявленные в главной программе, являются глобальными. Они доступны во всех внутренних точках программы, в том числе и в подпрограммах. Имена, объявленные в подпрограмме, являются локальными. Они доступны во всех внутренних точках подпрограммы. Во внешней программе локальное имя недоступно.

Если используются одинаковые локальное и глобальное имя, то внутри процедуры локальное имя блокирует глобальное.