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

Передача объектов методам по ссылке

В приведенных до сих пор примерах программ при указании параметров, передаваемых методам, использовались типы значений, например int или double. Но в методах можно также использовать параметры ссылочного типа, что не только правильно, но и весьма распространено в ООП. Подобным образом объекты могут передаваться методам по ссылке. В качестве примера рассмотрим следующую программу.

// Пример передачи объектов методам по ссылке.

using System;

class MyClass {
  int alpha, beta;

  public MyClass(int i, int j) {
    alpha = i;
    beta = j;
  }

  // Возвратить значение true, если параметр ob

  // имеет те же значения,  что и вызывающий объект.
  public bool SameAs(MyClass ob) {
    if ((ob.alpha == alpha) & (ob.beta == beta))
      return true;
    else
      return false;
  }

  // Сделать копию объекта ob.
  public void Copy(MyClass ob) {
    alpha = ob.alpha;
    beta = ob.beta;
  }

  public void Show() {
    Console.WriteLine("alpha: {0}, beta: {1}",
      alpha, beta);
  }
}

class PassOb {
  static void Main() {
    MyClass ob1 = new MyClass(4, 5);
    MyClass ob2 = new MyClass(6, 7);

    Console.Write("ob1:  ");
    ob1.Show();

    Console.Write("ob2:  ");
    ob2.Show();

    if (ob1.SameAs(ob2))
      Console.WriteLine("ob1 и ob2 имеют одинаковые значения.");
    else
      Console.WriteLine("ob1 и ob2 имеют разные значения.");

    Console.WriteLine();

    // А теперь сделать объект ob1 копией объекта оb2.
    ob1.Copy(ob2);

    Console.Write("ob1 после копирования:  ");
    ob1.Show();

    if (ob1.SameAs(ob2))
      Console.WriteLine("ob1 и ob2 имеют одинаковые значения.");
    else
      Console.WriteLine("ob1 и ob2 имеют разные значения.");
  }
}

Выполнение этой программы дает следующий резулbтат.

ob1:  alpha: 4, beta: 5
ob2:  alpha: 6, beta: 7
ob1 и ob2 имеют разные значения.

ob1 после копирования:  alpha: 6, beta: 7
ob1 и ob2 имеют одинаковые значения.

Каждый из методов SameAs() и Copy() в приведенной выше программе получает ссылку на объект типа MyClass в качестве аргумента. Метод SameAs() сравнивает значения переменных экземпляра alpha и beta в вызывающем объекте со значениями аналогичных переменных в объекте, передаваемом посредством параметра ob. Данный метод возвращает логическое значение true только в том случае, если оба объекта имеют одинаковые значения этих переменных экземпляра. А метод Copy() присваивает значения переменных alpha и beta из объекта, передаваемого по ссылке посредством параметра ob, переменным alpha и beta из вызывающего объекта. Как показывает данный пример, с точки зрения синтаксиса объекты передаются методам по ссылке таким же образом, как и значения обычных типов.

Практический пример организации управления доступомСпособы передачи аргументов методу