Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Использование модификаторов ref и out для ссылок на объекты C# Полное руководство Герберт Шилдт

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

Применение модификаторов 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 obi, 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();

      // Смена объектов, на которые ссылаются
      // аргументы х и у.
      х. Swap (ref х, ref у);

      Console .Write ("х после вызова: " );
      х.Show();

      Console.Write ("у после вызова: ");
      у.Show();
   }
}

При выполнении этой программы получается следующий результат:
   х до вызова: а: 1, b: 2
   у до вызова: а: 3, b: 4
 
   х после вызова: а: 3, b: 4
   у после вызова: а: 1, b: 2

В данном примере в методе Swap () производится смена объектов, на которые ссылаются два его аргумента. До вызова метода Swap () аргумент х ссылается на объект, содержащий значения 1 и 2, тогда как аргумент у ссылается на объект, содержащий значения 3 и 4. А после вызова метода Swap () аргумент х ссылается на объект, содержащий значения 3 и 4, тогда как аргумент у ссылается на объект, содержащий значения 1 и 2. Если бы не параметры ref, то перестановка в методе Swap () не имела бы никаких последствий за пределами этого метода. Для того чтобы убедиться в этом, исключите параметры ref из метода Swap ().