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

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

Модификатор параметра ref принудительно организует вызов по ссылке, а не по значению. Этот модификатор указывается как при объявлении, так и при вызове метода. Для начала рассмотрим простой пример. В приведенной ниже программе создается метод Sqr (), возвращающий вместо своего аргумента квадрат его целочисленного значения. Обратите особое внимание на применение и местоположение модификатора ref.

// Использовать модификатор ref для передачи значения
// обычного типа по ссылке.

using System;

class RefTest {
   // Этот метод изменяет свой аргумент. Обратите
   // внимание на применение модификатора ref.
   public void Sqr(ref int i) {
      i = i * i;
   }
}

class RefDemo {
   static void Main() {
      RefTest ob = new RefTest ();

      int a = 10;

      Console.WriteLine ("а до вызова: " + a);

      ob.Sqr(ref a); // обратите внимание на применение
                               // модификатора ref

      Console.WriteLine ("а после вызова: 11 + а);
   }
}


Как видите, модификатор ref указывается перед объявлением параметра в самом методе и перед аргументом при вызове метода. Ниже приведен результат выполнения данной программы, который подтверждает, что значение аргумента а действительно было изменено методом Sqr ().
   а до вызова: 10
   а после вызова: 100

Теперь, используя модификатор ref, можно написать метод, переставляющий местами значения двух своих аргументов простого типа. В качестве примера ниже приведена программа, содержащая метод Swap (), производящий перестановку значений двух своих целочисленных аргументов, когда он вызывается.

// Поменять местами два значения.

using System;

class ValueSwap {
   // Этот метод меняет местами свои аргументы.
   public void Swap (ref int a, ref int b) {
      int t;
      t = a;
      a = b;
      b = t;
   }
}

class ValueSwapDemo {
   static void Main() {
      ValueSwap ob = new ValueSwap();

      int x = 10, у = 20;

      Console.WriteLine ("x и у до вызова: " + x + " " + у) ;

      ob. Swap (ref x, ref y) ;

      Console.WriteLine ("x и у после вызова: " + х + " " + у) ;
   }
}


Вот к какому результату приводит выполнение этой программы:
   х и у до вызова: 10 20
   x и у после вызова: 20 10

В отношении модификатора ref необходимо иметь в виду следующее. Аргументу, передаваемому по ссылке с помощью этого модификатора, должно быть присвоено значение до вызова метода. Дело в том, что в методе, получающем такой аргумент в качестве параметра, предполагается, что параметр ссылается на действительное значение. Следовательно, при использовании модификатора ref в методе нельзя задать первоначальное значение аргумента.