Параметры-значения
По ссылке
По значению
Способы обмена информацией
При вызове метода выполняются следующие действия:
1. Вычисляются выражения, стоящие на месте аргументов
2. Выделяется память под параметры метода в соответствии с их типом
3. Каждому из параметров сопоставляется соответствующий аргумент
4. Выполняется тело метода
5. Если метод возвращает значение, оно передается в точку вызова. Если метод имеет тип void управление передается на оператор, следующий после вызова.
Пример передачи параметров
namespace ConsoleApplicationl
{ class Classl
{
int Max(int a, int b) // a,b-параметры метода, int-возвращаемое значение
{
if (a > b) return a;
else return b; //возврат в точку вызова максимального из 2-х чисел
}
static void Main()
{
int a = 2, b = 4;
int x = Max(a, b); //первый вызов метода с аргументамиa,b
Console.WriteLine(x);
short t1 = 3, t2 = 4;
int y = Max(t1, t2); //второй вызов метода
Console.WriteLine(y);
int z = Max(a + 3, 3 / 2 * 4); //третий вызов метода
Console.WriteLine(z);} } }
В приведенном примере описан метод Max, который выбирает наибольшее из двух переданных ему значений. Параметрами метода являются a и b. В основной программе метод Max вызывается три раза. В первый раз методу передаются два аргумента того же типа, что и параметры, во второй раз – аргументы совместимого типа, в троетий раз – выражение.
Количество аргументов должно соотстветствовать количеству параметров. На имена никаких ограничений не накладывается - могут совпадать или не совпадать.
Существует два способа передачи параметров:
При передаче по значению метод получает копии аргументов, и операторы внутри метода работают с этими копиями. Доступа к исходным значениям аргументов у метода нет, и, следовательно, нет возможности их изменять.
При передаче по ссылке (по адресу) метод получает адреса аргументов, осуществляет доступ к ячейкам памяти по этимадресам, следовательно может изменять значения аргументов, модифицируя параметры.
В языке C# для обмена данными между вызывающей и вызываемой функциями есть 4 типа параметров:
1. параметры-значения
2. параметры-ссылки
3. выходные параметры
4. параметры-массивы
Последний тип параметров (параметры-массивы) будут рассмотрены в дальнейших лекциях.
Параметры-значения задаются в заголовке метода обычным образом, например:
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();
} }}
Если в методы передаются объекты (экземпляры классов), то есть величины не значимых, а ссылочных типов, то эти объекты всегда передаются по ссылке!