class Num {
/
class DemoOut { static void Main { Num ob = new Num; int lcf, gcf; if(ob.HasComFactor(231, 105, out lcf, out gcf)) { Console.WriteLine("Наименьший общий множитель " + "чисел 231 и 105 равен " + lcf); Console.WriteLine("Наибольший общий множитель " + "чисел 231 и 105 равен " + gcf); } else Console.WriteLine("Общий множитель у чисел 35 и 49 отсутствует."); if(ob.HasComFactor(35, 51, out lcf, out gcf)) { Console.WriteLine("Наименьший общий множитель " + "чисел 35 и 51 равен " + lcf); Console.WriteLine("Наибольший общий множитель " + "чисел 35 и 51 равен " + gcf); } else Console.WriteLine("Общий множитель у чисел 35 и 51 отсутствует."); }
} Обратите внимание на то, что значения присваиваются переменным 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: {l}", 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; Console.Write("у до вызова: "); у.Show; Console.WriteLine; // Смена объектов, на которые ссылаются аргументы х и у. х.Swap(ref х, ref у); Console.Write("х после вызова: "); х.Show; Console.Write("у после вызова: "); у.Show; } }
При выполнении этой программы получается следующий результат. х до вызова: а: 1, b: 2 у до вызова: а: 3, b: 4 х после вызова: а: 3, b: 4 у после вызова: а: 1, b: 2
В данном примере в методе Swap выполняется смена объектов, на которые ссы лаются два его аргумента. До вызова метода Swap аргумент х ссылается на объект, содержащий значения 1 и 2, тогда как аргумент у ссылается на объект, содержащий значения 3 и 4. А после вызова метода Swap аргумент х ссылается на объект, содер жащий значения 3 и 4, тогда как аргумент у ссылается на объект, содержащий значе ния 1 и 2. Если бы не параметры типа ref, то перестановка в методе Swap не имела бы никаких последствий за пределами этого метода. Для того чтобы убедиться в этом, исключите параметры типа ref из метода Swap. Использование переменного числа аргументов