Обратите внимание на то, что значения присваиваются переменнымlcfиgcfв методеMain () до вызова методаHasComFactor . Если бы параметры методаHasComFactor были типаref,а неout,это привело бы к ошибке. Данный метод возвращает логическое значениеtrueилиfalse,в зависимости от того, имеется ли общий множитель у двух целых чисел. Если он имеется, то посредством параметров типаoutвозвращаются наименьший и наибольший общий множитель этих чисел. Ниже приведен результат выполнения данной программы.
Наименьший общий множитель чисел 231 и 105 равен 3 Наибольший общий множитель чисел 231 и 105 равен 21 Общий множитель у чисел 35 и 51 отсутствует.
Использование модификаторов ref и out для ссылок на объекты
Применение модификаторовrefиoutне ограничивается только передачей значений обычных типов. С их помощью можно также передавать ссылки на объекты. Если модификаторrefилиoutуказывает на ссылку, то сама ссылка передается по ссылке. Это позволяет изменить в методе объект, на который указывает ссылка. Рассмотрим в качестве примера следующую программу, в которой ссылочные параметры типаrefслужат для смены объектов, на которые указывают ссылки.
// Поменять местами две ссылки.
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 obi, ref RefSwap ob2) {
RefSwap t;
t = obi; obi = ob2; ob2 = t;
}
}
class RefSwapDemo { static void Main {
RefSwap x = new RefSwap(1, 2);
RefSwap у = new RefSwap(3, 4);
Console.Write("x до вызова: ") ; x.Show ;
Console.Write("у до вызова: "); у.Show;
Console.WriteLine ;
// Смена объектов, на которые ссылаются аргументы х и у. х.Swap (ref х, ref у);
Console.Write("х после вызова: "); х.Show;
Console.Write("у после вызова: ") ; у.Show ;
}
}
При выполнении этой программы получается следующий результат.
х до вызова: а: 1, Ь: 2 у до вызова: а: 3, Ь: 4
х после вызова: а: 3, Ь: 4 у после вызова: а: 1, Ь: 2