Применение модификаторов ref
и out
не ограничивается только передачей значений обычных типов. С их помощью можно также передавать ссылки на объекты. Если модификатор ref
или out
указывает на ссылку, то сама ссылка передается по ссылке. Это позволяет изменить в методе объект, на который указывает ссылка. Рассмотрим в качестве примера следующую программу, в которой ссылочные параметры типа ref
служат для смены объектов, на которые указывают ссылки.
// Поменять местами две ссылки.
using System;
class RefSwap {
int a, b;
public RefSwap(int i, int j) {
a = i;
b = j;
}
public void Show() {
Console.WriteLine("a: {0}, b: {1}", a, b);
}
// Этот метод изменяет свои аргументы,
public void Swap(ref RefSwap ob1, ref RefSwap ob2) {
RefSwap t;
t = ob1;
ob1 = ob2;
ob2 = t;
}
}
class RefSwapDemo {
static void Main() {
RefSwap x = new RefSwap(1, 2);
RefSwap у = new RefSwap(3, 4);
Console.Write("x до вызова: ");
x.Show();
Console.Write("у до вызова: ");
у.Show();
Console.WriteLine();
// Смена объектов, на которые ссылаются аргументы х и у.
x.Swap(ref x, ref у);
Console.Write("х после вызова: ");
x.Show();
Console.Write("у после вызова: ");
у.Show();
}
}
При выполнении этой программы получается следующий результат.
x до вызова: a: 1, b: 2
у до вызова: a: 3, b: 4
х после вызова: a: 3, b: 4
у после вызова: a: 1, b: 2
В данном примере в методе Swap()
выполняется смена объектов, на которые ссылаются два его аргумента. До вызова метода Swap()
аргумент x
ссылается на объект, содержащий значения 1 и 2, тогда как аргумент y
ссылается на объект, содержащий значения 3 и 4. А после вызова метода Swap()
аргумент x
ссылается на объект, содержащий значения 3 и 4, тогда как аргумент y
ссылается на объект, содержащий значения 1 и 2. Если бы не параметры типа ref
, то перестановка в методе Swap()
не имела бы никаких последствий за пределами этого метода. Для того чтобы убедиться в этом, исключите параметры типа ref из метода Swap()
.
Использование модификатора параметра out | Использование переменного числа аргументов |