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 копией объекта ob2.

    ob1.Copy(ob2);

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

    ob1.Show();

    if(ob1.SameAs(ob2) )

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

    else

      Console.WriteLine("ob1 и ob2 имеют разные значения.");

  }

}

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

ob1: alpha: 4, beta: 5

ob2: alpha: 6, beta: 7

оb1 и ob2 имеют разные значения.

оb1 после копирования: alpha: 6, beta: 7

ob1 и оb2 имеют одинаковые значения.

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

Способы передачи аргументов методу

Как показывает приведенный выше пример, передача объекта методу по ссылке делается достаточно просто. Но в этом примере показаны не все нюансы данного процесса. В некоторых случаях последствия передачи объекта по ссылке будут отличаться от тех результатов, к которым приводит передача значения обычного типа. Для выяснения причин этих отличий рассмотрим два способа передачи аргументов методу.

Первым способом является вызов по значению. В этом случае значение аргумента копируется в формальный параметр метода. Следовательно, изменения, вносимые в параметр метода, не оказывают никакого влияния на аргумент, используемый для вызова. А вторым способом передачи аргумента является вызов по ссылке. В данном случае параметру метода передается ссылка на аргумент, а не значение аргумента. В методе эта ссылка используется для доступа к конкретному аргументу, указываемому при вызове. Это означает, что изменения, вносимые в параметр, будут оказывать влияние на аргумент, используемый для вызова метода.

По умолчанию в C# используется вызов по значению, а это означает, что копия аргумента создается и затем передается принимающему параметру. Следовательно, при передаче значения обычного типа, например int или double, все, что происходит с параметром, принимающим аргумент, не оказывает никакого влияния за пределами метода. В качестве примера рассмотрим следующую программу.

// Передача аргументов обычных типов по значению,

using System;

class Test {

  /* Этот метод не оказывает никакого влияния на аргументы, используемые для его вызова. */

  public void NoChange(int i, int j) {

    i = i + j;

    j = -j;

  }

}

class CallByValue {

  static void Main() {

    Test ob = new Test();

    int a = 15, b = 20;

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

    ob.NoChange(a, b);

    Console.WriteLine("а и b после вызова: " + a + " " + b) ;

  }

}

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

а и b до вызова: 15 20

Перейти на страницу:

Похожие книги