Пример заголовка метода, имеющего один параметр-ссылку целого типа: void В(ref int z);
Строго говоря, методы, которые результатом своей работы имеют лишь одну величину, возвращают ее в вызывающий блок с помощью оператора return. Этот вариант намного проще, так как не требует работы с параметрами-ссылками.
Параметры-ссылки рекомендуется использовать лишь в тех случаях, когда метод должен возвращать более одной величины, или если в методе требуется изменить значения каких-либо передаваемых в него величин.
Исходные данные передавать в метод по ссылке можно, но не рекомендуется, чтобы исключить возможность их непреднамеренного изменения. Однако необходимо помнить, что для параметра-значения в метод передается его копия. И если размер этого значения очень велик, то увеличивается расход оперативной памяти на копии. Особенно ее расход возрастает при работе рекурсивных методов. В этом случае возможно использовать для передачи исходных данных параметры-переменные, но под бдительным оком программиста.
|
|
Проиллюстрируем передачу параметров-значений и параметров-ссылок на примере (листинг 3).
Листинг 3- Параметры-значения и параметры-ссылки
using System;
namespace ConsoleApplication3
{
class Program
{
static void Prim(int w, ref int z)
{
w = 5; z = w;
Console.WriteLine("внутри метода Prim: w="+w+" z="+z);
}
static void Main()
{
int w = 1, z = 2;
Console.WriteLine("до вызова Prim: w=" + w + " z=" + z);
Prim(w, ref z);
Console.WriteLine("после завершения работы Prim: w=" + w + " z=" + z);
}
}
}
Суть этой простой программы заключается в следующем: в методе Main задаются начальные значения двух переменных int w = 1, z = 2;
Затем вызывается объявленный ранее в данном классе метод Prim, в котором значения переменных становятся равными: w = 5; z = w;
После завершения работы метода Prim вновь проверяются значения переменных.
Результаты работы этой программы:
Как легко увидеть, значение переменной w и до и после работы метода Prim одно и то же, оно не изменилось, поскольку переменная передавалась по значению, а значение переменной z изменилось потому, что она была передана по ссылке.
Несколько иная картина получится, если передавать в метод не величины значимых типов, а экземпляры классов, то есть величины ссылочных типов. Как вы помните, переменная-объект на самом деле хранит ссылку на данные, расположенные в динамической памяти, и именно эта ссылка передается в метод либо по адресу, либо по значению. В обоих случаях метод получает в свое распоряжение фактический адрес данных и, следовательно, может их изменить.
Для простоты можно считать, что объекты всегда передаются по ссылке. Разница между передачей объектов по значению и по ссылке состоит в том, что в последнем случае можно изменить саму ссылку, то есть после вызова метода она может указывать на другой объект.