а и b до вызова: 15 20 а и b после вызова: 15 20 Как видите, операции, выполняемые в методе NoChange, не оказывают никакого влияния на значения аргументов а и b, используемых для вызова данного метода. Это опять же объясняется тем, что параметрам i и j переданы копии значений аргументов а и b, а сами аргументы а и b совершенно не зависят от параметров i и j. В частности, присваивание параметру i нового значения не будет оказывать никакого влияния на аргумент а. Дело несколько усложняется при передаче методу ссылки на объект. В этом случае сама ссылка по-прежнему передается по значению. Следовательно, создается копия ссылки, а изменения, вносимые в параметр, не оказывают никакого влияния на аргу мент. (Так, если организовать ссылку параметра на новый объект, то это изменение не повлечет за собой никаких последствий для объекта, на который ссылается аргумент.) Но главное отличие вызова по ссылке заключается в том, что изменения, происходя щие с объектом, на который ссылается параметр, окажут влияние на тот объект, на который ссылается аргумент. Попытаемся выяснить причины подобного влияния. Напомним, что при создании переменной типа класса формируется только ссыл ка на объект. Поэтому при передаче этой ссылки методу принимающий ее параметр будет ссылаться на тот же самый объект, на который ссылается аргумент. Это означает, что и аргумент, и параметр ссылаются на один и тот же объект и что объекты, по суще ству, передаются методам по ссылке. Таким образом, объект в методе будет оказывать влияние на объект, используемый в качестве аргумента. Для примера рассмотрим сле дующую программу.
// Передача объектов по ссылке. using System;
class Test {
public int a, b;
public Test(int i, int j) {
a = i;
b = j;
}
/
class CallByRef { static void Main { Test ob = new Test(15, 20); Console.WriteLine("ob.а и ob.b до вызова: " + ob.a + " " + ob.b); ob.Change(ob); Console.WriteLine("ob.а и ob.b после вызова: " + ob.a + " " + ob.b); } } Выполнение этой программы дает следующий результат.