Материал предоставлен http://it.rfet.ru

Использование модификаторов ref и out для ссылок на объекты

Применение модификаторов 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Использование переменного числа аргументов