Параметры-значения задаются в заголовке метода обычным образом, например:
void func(int x)
В данном примере параметр х – это параметр-значение, который предсталяет собой локальную переменную, которая получает свое значение при вызове метода func. В метод передается копия значения аргумента для х.
Во многих методах все величины, которые метод должен получить в качетстве исходных данных,описываются в списке перемтров, а величина, которую вычислет метод как результат своей работы, возвращается в вызывающий код с помощью оператора return. Если метод должен возвращать более,чем одно значение, такой способ не годится.
Также, если в методе требуется изменить значение передаваемых в него величин используются параметры –ссылки.
Параметры-ссылки задаются в заголовке метода с использованием ключевого слова ref, например:
void func(refint x)
При вызове такого метода параметр копирует не значение аргумента для х, а его адрес, поэтому внутри метода значение переданного параметра изменяется.
Пример применения параметров-значений и параметров-ссылок
namespace ConsoleApplication2
{
class Program
{
static void p(int a, ref int b)//обратите внимание на слово static!
{
a = 44;
b = 33;
Console.WriteLine("внутри метода {0} {1}", a, b);
}
static void Main(string[] args)
{
int a = 2, b = 4;
Console.WriteLine("до вызова метода {0} {1}", a, b);
p(a, ref b);//обратите внимание на ВЫЗОВ метода
Console.WriteLine("после вызова метода {0} {1}", a, b);
Console.ReadKey();
} }}
Если в методы передаются объекты (экземпляры классов), то есть величины не значимых, а ссылочных типов, то эти объекты всегда передаются по ссылке!
Часто возникает необходимость в методах, которые формируют несколько величин. Параметру, имеющему спецификатор out, должно быть присвоено значение внутри метода. Тем самым, можно из метода получить несколько значений-результатов работы.
namespace ConsoleApplication2
{
class Program
{
static void p(int a, out int b, out int c)
{
a = 44;
b = 33;
c = a + b;
Console.WriteLine("внутри метода {0} {1} {2}", a, b,c);
}
static void Main(string[] args)
{
int a = 2, b,c;
p(a, out b,out c);//обратите внимание на ВЫЗОВ метода
Console.WriteLine("после вызова метода {0} {1} {2}", a, b,c);
Console.ReadKey();
} }}
Хорошим стилем программирования считается, если в списке параметров сначала записываются входные параметры, затем – параметры ссылки, затем – выходные параметры.
ВЫВОДЫ:
1. Параметры, поступающие в функцию, рассматриваются компилятором как дополнительные переменные, т.е. происходит их копирование в стек и внутри функции используется их копия, находящаяся в стеке.
2. В случае, если аргумент – имя переменной или выражение, то осуществляется копирование аргумента в стек на место соответствующего параметра, то есть реализуется способ обмена данными – передача аргумента по значению.
3. Если в качестве параметра используется адрес аргумента, то в стек помещается адрес этого значения. Это 2 способ – передача по ссылке.