Выбрать главу

// Использовать два параметра типа out. using System; class Num {

/* Определить, имеется ли у числовых значений переменных х и v общий множитель. Если имеется, то * возвратить наименьший и наибольший множители посредством параметров типа out. */ public bool HasComFactor(int x, int y,

out int least, out int greatest) {

int i;

int max = x < у ? x : y; bool first = true;

least = 1; greatest = 1;

// Найти наименьший и наибольший общий множитель. for(i=2; i <= max/2 + 1; i++)    {

if( ((y%i)==0) & ((x%i)==0) )    {

if (first) { least = i; first = false;

}

greatest = i;

}

}

if(least != 1) return true; else return false;

}

}

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: {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

В данном примере в методе Swap () выполняется смена объектов, на которые ссылаются два его аргумента. До вызова метода Swap () аргумент х ссылается на объект, содержащий значения 1 и 2, тогда как аргумент у ссылается на объект, содержащий значения 3 и 4. А после вызова метода Swap () аргумент х ссылается на объект, содержащий значения 3 и 4, тогда как аргумент у ссылается на объект, содержащий значения 1 и 2. Если бы не параметры типа ref, то перестановка в методе Swap () не имела бы никаких последствий за пределами этого метода. Для того чтобы убедиться в этом, исключите параметры типа ref из метода Swap ().