Якщо метод повинен повертати більш за одну величину потрібно змінити значення яких-небудь переданих в нього величин. У цих випадках використовуються параметри-посилання.
Ознакою параметра-посилання є ключове слово ref :
ref тип ім'я
Приклад заголовка методу, що має один параметр-посилання цілого типу:
void Р( ref int х )
При виклику методу в область параметрів копіюється не значення аргументу, а його адреса, і метод через нього має доступ до осередку, в якому зберігається аргумент. Таким чином, параметри-посилання передаються за адресою (частіше вживається термін «передача по посиланню»). Метод працює безпосередньо із змінною функції і, отже, може її змінити, тому якщо в методі потрібно змінити значення параметрів, вони повинні передаватися тільки по посиланню.
Проілюструємо передачу параметрів-значень і параметрів-посилань на прикладі лістингу 5.4.
Лістинг 5.4. Параметри - значення і параметри - посилання
using System;
namespace ConsoleApplicationl
{
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 змінилося тому, що вона була передана по посиланню. Декілька інша картина вийде, якщо передавати в метод не величини значущих типів, а екземпляри класів, тобто величини посилальних типів. Як ви пам'ятаєте, змінна-об'єкт насправді зберігає посилання на дані, розташовані в динамічній пам'яті, і саме це посилання передається в метод або за адресою, або за значенням. У обох випадках метод отримує в своє розпорядження фактичну адресу даних і, отже, може їх змінити.
Для простоти можна вважати, що об'єкти завжди передаються по посиланню. Різниця між передачею об'єктів за значенням і по посиланню полягає в тому, що в останньому випадку можна змінити саме посилання, тобто після виклику методу воно може указувати на інший об'єкт.