Параметры-ссылки

Во многих методах все величины, которые метод должен получить в качестве ис­ходных данных, описываются в списке параметров, а величина, которую вычис­ляет метод как результат своей работы, возвращается в вызывающий код с помо­щью оператора 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 изменилось пото­му, что она была передана по ссылке.

Несколько иная картина получится, если передавать в метод не величины значи­мых типов, а экземпляры классов, то есть величины ссылочных типов. Как вы помните, переменная-объект на самом деле хранит ссылку на данные, располо­женные в динамической памяти, и именно эта ссылка передается в метод либо по адресу, либо по значению. В обоих случаях метод получает в свое распоряже­ние фактический адрес данных и, следовательно, может их изменить.

СОВЕТ

Для простоты можно считать, что объекты всегда передаются по ссылке.

Разница между передачей объектов по значению и по ссылке состоит в том, что в последнем случае можно изменить саму ссылку, то есть после вызова метода она может указывать на другой объект.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: