Во многих методах все величины, которые метод должен получить в качестве исходных данных, описываются в списке параметров, а величина, которую вычисляет метод как результат своей работы, возвращается в вызывающий код с помощью оператора return. Очевидно, что если метод должен возвращать более одной величины, такой способ не годится. Еще одна проблема возникает, если в методе требуется изменить значение каких-либо передаваемых в него величин. В этих случаях используются параметры-ссылки.
Признаком параметра-ссылки является ключевое слово ref перед описанием параметра: ref тип имя Пример заголовка метода, имеющего один параметр-ссылку целого типа:
void P(ref int х)
При вызове метода в область параметров копируется не значение аргумента, а его адрес, и метод через него имеет доступ к ячейке, в которой хранится аргумент. Таким образом, параметры-ссылки передаются по адресу (чаще употребляется термин «передача по ссылке»). Метод работает непосредственно с переменной из вызывающей функции и, следовательно, может ее изменить, поэтому если в методе требуется изменить значения параметров, они должны передаваться только по ссылке.
|
|
ВНИМАНИЕ
При вызове метода на месте параметра-ссылки может находиться только ссылка на инициализированную переменную точно того же типа. Перед именем параметра указывается ключевое слово ref.
Исходные данные передавать в метод по ссылке не рекомендуется, чтобы исключить возможность их непреднамеренного изменения.
Проиллюстрируем передачу параметров-значений и параметров-ссылок на примере (листинг 5.4).
Листинг 5.4. Параметры-значения и параметры-ссылки
using System;
namespace ConsoleApplication1
{
class Class1
{
static void P(int a, ref int b)
{
a = 44; b = 33;
Console.WriteLine("внутри метода {0} {1}", a, b);
}
static void Main()
{
int a = 2, b = 4;
Console.WriteLine("до вызова {0} {1}", a, b);
P(a, ref b);
Console.WriteLine("после вызова {0} {1}", a, b);
}
}
}
Результаты работы этой программы:
до вызова 2 4
внутри метода 44 33
после вызова 2 33
Как видите, значение переменной а в функции Main не изменилось, поскольку переменная передавалась по значению, а значение переменной b изменилось потому, что она была передана по ссылке.
Несколько иная картина получится, если передавать в метод не величины значимых типов, а экземпляры классов, то есть величины ссылочных типов. Как вы помните, переменная-объект на самом деле хранит ссылку на данные, расположенные в динамической памяти, и именно эта ссылка передается в метод либо по адресу, либо по значению. В обоих случаях метод получает в свое распоряжение фактический адрес данных и, следовательно, может их изменить.
СОВЕТ
Для простоты можно считать, что объекты всегда передаются по ссылке.
Разница между передачей объектов по значению и по ссылке состоит в том, что в последнем случае можно изменить саму ссылку, то есть после вызова метода она может указывать на другой объект.