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