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

Использование модификатора параметра ref

Модификатор параметра 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 до вызова: " + a);
    ob.Sqr(ref a);  // обратите внимание на применение модификатора ref
    Console.WriteLine("a после вызова: " + a);
  }
}

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

a до вызова: 10
a после вызова: 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, y = 20;

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

    ob.Swap(ref x, ref y);

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

Вот к какому результату приводит выполнение этой программы.

x и y до вызова:  10 20
x и y после вызова:  20 10

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

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