Вход/Регистрация
Полное руководство. С# 4.0
вернуться

Шилдт Герберт

Шрифт:

а до вызова: 10 а после вызова: 100 Теперь, используя модификатор ref, можно написать метод, переставляющий ме стами значения двух своих аргументов простого типа. В качестве примера ниже при ведена программа, в которой метод Swap выполняет перестановку значений двух своих целочисленных аргументов, когда он вызывается.

// Поменять местами два значения. using System;

class ValueSwap { // Этот метод меняет местами свои аргументы. public void Swap(ref int a, ref int b) { int t; t = a; a = b; b = t; } }

class ValueSwapDemo { static void Main { ValueSwap ob = new ValueSwap; int x = 10, у = 20; Console.WriteLine("x и у до вызова: " + х + " " + у); ob.Swap(ref х, ref у); Console.WriteLine("х и у после вызова: " + х + " " + у); } } Вот к какому результату приводит выполнение этой программы.

х и у до вызова: 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. И во-вторых, дробную часть этого значения посредством параметра frас типа out. Как показывает данный пример, используя модификатор параметра out, можно организовать возврат двух значений из одного и того же метода. Разумеется, никаких ограничений на применение параметров out в одном методе не существует. С их помощью из метода можно возвратить сколько угодно фрагментов информации. Рассмотрим пример применения двух параметров out. В этом примере программы метод HasComFactor выполняет две функции. Во-первых, он определя ет общий множитель (кроме 1) для двух целых чисел, возвращая логическое значение true, если у них имеется общий множитель, а иначе — логическое значение false. И во-вторых, он возвращает посредством параметров типа out наименьший и наи больший общий множитель двух чисел, если таковые обнаруживаются.

// Использовать два параметра типа 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: {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
  • ...
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: