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.Show; if(ob1.SameAs(ob2)) Console.WriteLine("ob1 и ob2 имеют одинаковые значения."); else Console.WriteLine("ob1 и ob2 имеют разные значения."); } } Выполнение этой программы дает следующий результат.
ob1: alpha: 4, beta: 5 ob2: alpha: 6, beta: 7 ob1 и ob2 имеют разные значения. ob1 после копирования: 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 {
/
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); } } Вот какой результат дает выполнение этой программы.