При вызове метода выполняются следующие действия:
1. Вычисляются выражения, стоящие на месте аргументов.
2. Выделяется память под параметры метода в соответствии с их типом.
3. Каждому из параметров сопоставляется соответствующий аргумент.
4. Выполняется тело метода.
5. Если метод возвращает значение, оно передается в точку вызова; если метод имеет тип void, управление передается на оператор, следующий после вызова.
При этом проверяется соответствие типов аргументов и параметров и при необходимости выполняется их преобразование. При несоответствии типов выдается диагностическое сообщение.
Существуют два способа передачи параметров: по значению и по ссылке.
При передаче по значению метод получает копии значений аргументов, и операторы метода работают с этими копиями. Доступа к исходным значениям аргументов у метода нет, а, следовательно, нет и возможности их изменить.
При передаче по ссылке (по адресу) метод получает копии адресов аргументов, он осуществляет доступ к ячейкам памяти по этим адресам и может изменять исходные значения аргументов, модифицируя параметры.
В С# для обмена данными между вызывающей и вызываемой функциями предусмотрено четыре типа параметров:
- параметры-значения;
- параметры-ссылки — описываются с помощью ключевого слова ref;
- выходные параметры — описываются с помощью ключевого слова оut;
- параметры-массивы — описываются с помощью ключевого слова рarams.
Ключевое слово предшествует описанию типа параметра. Если оно опущено, параметр считается параметром-значением. Параметр-массив может быть только один и должен располагаться последним в списке.
Листинг 2- Передача параметров методу
using System;
namespace ConsoleApplication1
{ class Class1
{
static int Max(int a, out int b) / / метод выбора максимального значения
{
if (а > b) return а;
еlse return b;
}
static void Main()
{
int a = 2, b = 4;
int x = Мах(а, b); / / вызов метода Мах
Соnsole.WriteLine(х); / / результат: 4
short t1 = 3, t2 = 4;
int у = Мах(t1, t2); / / вызов метода Мах
Соnsole.WriteLinе(у); / / результат: 4
int z = Мах(а + t1, t1 / 2 * b); / / вызов метода Мах
Соnsole.WriteLine(z); / / результат: 5
}
}
}
В классе описан метод Мах, который выбирает наибольшее из двух переданных ему значений. Параметры описаны как а и b. В методе Main выполняются три вызова Мах. В результате первого вызова методу Мах передаются два аргумента того же типа, что и параметры, во втором вызове — аргументы совместимого типа, в третьем — выражения.
Главное требование при передаче параметров состоит в том, что аргументы при вызове метода должны записываться в том же порядке, что и параметры в заголовке метода. Правила соответствия типов аргументов и параметров описаны в следующих разделах.
Количество аргументов должно соответствовать количеству параметров. На имена никаких ограничений не накладывается: имена аргументов могут как совпадать, так и не совпадать с именами параметров.