![]()
|
|||
Пример 1.. Пример 2.Пример 1. using System; class Test { public int a, b; public Test() { } public Test(int i, int j) { // конструктор a = i; b = j; } public void NoChange(ref int i, int j, out double frac) { frac = (double) (i + j)/2; i = i + j; j = -j; }
public void Change(Test ob) { // ссылочный параметр ob.a = ob.a + ob.b; ob.b = -ob.b; } }
class CallByValue { static void Main() { Test ob = new Test(); int a = 15, b = 20; double f; Console.WriteLine ("а и b до вызова: " + a + " " + b); //15 2 0 ob.NoChange(ref a, b, outf); Console.WriteLine("а, b и f после вызова: " + a + " " + b + " " + f); // 35 20 22,5
Test ob1 = new Test(15, 20); Console.WriteLine("ob1.a и ob1.b до вызова: " + ob1.a +" "+ ob1.b); // 15 20 ob1.Change(ob1); Console.WriteLine("ob1.a и ob1.b после вызова: " + ob1.a + " " + ob1.b); // 35 -20 } }
Применение модификаторов ref и out не ограничивается только передачей значений обычных типов. С их помощью можно также передавать ссылки на объекты. Если модификатор ref или out указывает на ссылку, то сама ссылка передается по ссылке. Это позволяет изменить в методе объект, на который указывает ссылка.
Пример 2. using System; class RefSwap { int a, b; public RefSwap(int i, int j) { // конструктор a = i; b = j; } public void Show() { Console.WriteLine ("a: {0}, b: {1}", a, b); } // Этот метод изменяет свои аргументы, public void Swap(ref RefSwap ob1, ref RefSwap ob2) { RefSwap t; t = ob1; ob1 = ob2; ob2 = t; } } class RefSwapDemo { static void Main() { RefSwap x = new RefSwap(1, 2); RefSwap у = new RefSwap(3, 4); Console.Write("x до вызова: "); x.Show(); // х до вызова: а: 1, b: 2 Console.Write("у до вызова: "); у. Show (); // у до вызова: а: 3, b: 4
Console.WriteLine (); // Смена объектов, на которые ссылаются аргументы х и у. х.Swap(ref x, ref у); Console.Write("х после вызова: "); х.Show(); // х после вызова: а: 3, b: 4 Console.Write("у после вызова: "); у.Show(); // у после вызова: а: 1, b: 2 } } В методе Swap() выполняется смена объектов, на которые ссылаются два его аргумента. До вызова метода Swap() аргумент х ссылается на объект, содержащий значения 1 и 2, тогда как аргумент у ссылается на объект, содержащий значения 3 и 4. А после вызова метода Swap() аргумент х ссылается на объект, содержащий значения 3 и 4, тогда как аргумент у ссылается на объект, содержащий значения 1 и 2. Если бы не параметры типа ref, то перестановка в методе Swap() не имела бы никаких последствий за пределами этого метода.
|
|||
|