х и у до вызова: 10 20 х и у после вызова: 20 10 В отношении модификатора ref необходимо иметь в виду следующее. Аргументу, передаваемому по ссылке с помощью этого модификатора, должно быть присвоено значение до вызова метода. Дело в том, что в методе, получающем такой аргумент в качестве параметра, предполагается, что параметр ссылается на действительное зна чение. Следовательно, при использовании модификатора ref в методе нельзя задать первоначальное значение аргумента. ### Использование модификатора параметра out Иногда ссылочный параметр требуется использовать для получения значения из метода, а не для передачи ему значения. Допустим, что имеется метод, выполняющий некоторую функцию, например, открытие сетевого сокета и возврат кода успешно го или неудачного завершения данной операции в качестве ссылочного параметра. В этом случае методу не передается никакой информации, но в то же время он должен возвратить определенную информацию. Главная трудность при этом состоит в том, что параметр типа ref должен быть инициализирован определенным значением до вызова метода. Следовательно, чтобы воспользоваться параметром типа ref, придется задать для аргумента фиктивное значение и тем самым преодолеть данное ограниче ние. Правда, в C# имеется более подходящий вариант выхода из подобного затрудне ния — воспользоваться модификатором параметра out. Модификатор параметра out подобен модификатору ref, за одним исключени ем: он служит только для передачи значения за пределы метода. Поэтому перемен ной, используемой в качестве параметра out, не нужно (да и бесполезно) присваи вать какое-то значение. Более того, в методе параметр out считается неинициализи рованным, т.е. предполагается, что у него отсутствует первоначальное значение. Это означает, что значение должно быть присвоено данному параметру в методе до его завершения. Следовательно, после вызова метода параметр out будет содержать не которое значение. Ниже приведен пример применения модификатора параметра out. В этом приме ре программы для разделения числа с плавающей точкой на целую и дробную части используется метод GetParts из класса Decompose. Обратите внимание на то, как возвращается каждая часть исходного числа.
// Использовать модификатор параметра out. using System;
class Decompose {
/
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. И во-вторых, дробную часть этого значения посредством параметра frас типа out. Как показывает данный пример, используя модификатор параметра out, можно организовать возврат двух значений из одного и того же метода. Разумеется, никаких ограничений на применение параметров out в одном методе не существует. С их помощью из метода можно возвратить сколько угодно фрагментов информации. Рассмотрим пример применения двух параметров out. В этом примере программы метод HasComFactor выполняет две функции. Во-первых, он определя ет общий множитель (кроме 1) для двух целых чисел, возвращая логическое значение true, если у них имеется общий множитель, а иначе — логическое значение false. И во-вторых, он возвращает посредством параметров типа out наименьший и наи больший общий множитель двух чисел, если таковые обнаруживаются.
// Использовать два параметра типа out. using System;