static void Main() {
ValueSwap ob = new ValueSwap();
int x=10, у = 20;
Console.WriteLine("x и у до вызова: " + x + " " + у);
ob.Swap(ref x, ref у);
Console.WriteLine("x и у после вызова: " + x + " " + у);
}
}
Вот к какому результату приводит выполнение этой программы.
х и у до вызова: 10 20
х и у после вызова: 20 10
В отношении модификатора ref
необходимо иметь в виду следующее. Аргументу, передаваемому по ссылке с помощью этого модификатора, должно быть присвоено значение до вызова метода. Дело в том, что в методе, получающем такой аргумент в качестве параметра, предполагается, что параметр ссылается на действительное значение. Следовательно, при использовании модификатора ref
в методе нельзя задать первоначальное значение аргумента.
Использование модификатора параметра out
Иногда ссылочный параметр требуется использовать для получения значения из метода, а не для передачи ему значения. Допустим, что имеется метод, выполняющий некоторую функцию, например, открытие сетевого сокета и возврат кода успешного или неудачного завершения данной операции в качестве ссылочного параметра. В этом случае методу не передается никакой информации, но в то же время он должен возвратить определенную информацию. Главная трудность при этом состоит в том, что параметр типа ref
должен быть инициализирован определенным значением до вызова метода. Следовательно, чтобы воспользоваться параметром типа ref
, придется задать для аргумента фиктивное значение и тем самым преодолеть данное ограничение. Правда, в C# имеется более подходящий вариант выхода из подобного затруднения — воспользоваться модификатором параметра out
.
Модификатор параметра out
подобен модификатору ref
, за одним исключением: он служит только для передачи значения за пределы метода. Поэтому переменной, используемой в качестве параметра out
, не нужно (да и бесполезно) присваивать какое-то значение. Более того, в методе параметр out
считается неинициализированным , т.е. предполагается, что у него отсутствует первоначальное значение. Это означает, что значение должно быть присвоено данному параметру в методе до его завершения. Следовательно, после вызова метода параметр out
будет содержать некоторое значение.
Ниже приведен пример применения модификатора параметра out
. В этом примере программы для разделения числа с плавающей точкой на целую и дробную части используется метод GetParts()
из класса Decompose
. Обратите внимание на то, как возвращается каждая часть исходного числа.
// Использовать модификатор параметра out.
using System;
class Decompose {
/* Разделить числовое значение с плавающей точкой на целую и дробную части. */
public int GetParts(double n, out double frac) {
int whole;
whole = (int) n;
frac = n - whole; // передать дробную часть числа через параметр frac
return whole; // возвратить целую часть числа
}
}
class UseOut {
static void Main() {
Decompose ob = new Decompose();
int i;
double f;
i = ob.GetParts(10.125, out f) ;
Console.WriteLine("Целая часть числа равна " + i);
Console.WriteLine("Дробная часть числа равна " + f);
}
}
Выполнение этой программы дает следующий результат.
Целая часть числа равна 10
Дробная часть числа равна 0.125
Метод GetParts()
возвращает два фрагмента информации. Во-первых, целую часть исходного числового значения переменной n обычным образом с помощью оператора return
. И во-вторых, дробную часть этого значения посредством параметра fгас
типа out
. Как показывает данный пример, используя модификатор параметра out
, можно организовать возврат двух значений из одного и того же метода.
Разумеется, никаких ограничений на применение параметров out
в одном методе не существует. С их помощью из метода можно возвратить сколько угодно фрагментов информации. Рассмотрим пример применения двух параметров out
. В этом примере программы метод HasComFactor()
выполняет две функции. Во-первых, он определяет общий множитель (кроме 1) для двух целых чисел, возвращая логическое значение true
, если у них имеется общий множитель, а иначе — логическое значение false
. И во-вторых, он возвращает посредством параметров типа out
наименьший и наибольший общий множитель двух чисел, если таковые обнаруживаются.
Читать дальше