Мегаобучалка Главная | О нас | Обратная связь


Использование модификатора параметра out



2020-03-19 142 Обсуждений (0)
Использование модификатора параметра out 0.00 из 5.00 0 оценок




Модификатор параметра 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. И во-вторых, дробную часть этого значения посредством параметра frac типа out. Как показывает данный пример, используя модификатор параметра out, можно организовать возврат двух значений из одного и того же метода.

Никаких ограничений на применение параметров out в одном методе не существует. С их помощью из метода можно возвратить сколько угодно фрагментов информации.

 

 Использование модификаторов 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 ob1, ref RefSwap ob2) {

RefSwap t;

 

t = ob1;

ob1 = ob2;

ob2 = t;

}

}

 

class RefSwapDemo

{

static void Main()

{

RefSwap x = new RefSwap(1, 2);

RefSwap y = new RefSwap(3, 4);

 

Console.Write("x до вызова: ");

x.Show();

 

Console.Write("y до вызова: ");

y.Show();

 

Console.WriteLine();

 

// Смена объектов, на которые ссылаются аргументы x и y.

x.Swap(ref x, ref y); 

 

Console.Write("x после вызова: ");

x.Show();

 

Console.Write("y после вызова: ");

y.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().

 Использование переменного числа аргументов

При создании метода обычно заранее известно число аргументов, которые будут переданы ему, но так бывает не всегда. Иногда возникает потребность создать метод, которому можно было бы передать произвольное число аргументов. Делается это с помощью параметра типа params.

Для объявления массива параметров, способного принимать от нуля до нескольких аргументов, служит модификатор params. Число элементов массива параметров бу­дет равно числу аргументов, передаваемых методу. А для получения аргументов в про­грамме организуется доступ к данному массиву.

Ниже приведен пример программы, в которой модификатор params использует­ся для создания метода MinVal(), возвращающего наименьшее среди ряда заданных значений.

// Продемонстрировать применение модификатора params.

 

using System;

 

class Min

{

public int MinVal(params int[] nums)

{

int m;

 

if(nums.Length == 0) {

Console.WriteLine("Ошибка: нет аргументов.");

return 0;

}

 

m = nums[0];

for(int i=1; i < nums.Length; i++) 

if(nums[i] < m) m = nums[i];

 

return m;

}

}

 

class ParamsDemo

{

static void Main()

{

Min ob = new Min();

int min;

int a = 10, b = 20;

 

// Вызвать метод с двумя значениями.

min = ob.MinVal(a, b);

Console.WriteLine("Наименьшее значение равно " + min);

 

// Вызвать метод с тремя значениями.

min = ob.MinVal(a, b, -1);

Console.WriteLine("Наименьшее значение равно " + min);

 

// Вызвать метод с пятью значениями.

min = ob.MinVal(18, 23, 3, 14, 25);

Console.WriteLine("Наименьшее значение равно " + min);

 

// Вызвать метод с массивом целых значений.

int[] args = { 45, 67, 34, 9, 112, 8 };

min = ob.MinVal(args);

Console.WriteLine("Наименьшее значение равно " + min);

}

}

 

При выполнении этой программы получается следующий результат.

Наименьшее значение равно 10

Наименьшее значение равно -1

Наименьшее значение равно 3

Наименьшее значение равно 8

Всякий раз, когда вызывается метод MinVal(), ему передаются аргументы в мас­сиве nums. Длина этого массива равна числу передаваемых аргументов. Поэтому с по­мощью метода MinVal() можно обнаружить наименьшее среди любого числа зна­чений.

Обратите внимание на последний вызов метода MinVal(). Вместо отдельных значе­ний в данном случае передается массив, содержащий ряд значений. И такая передача аргументов вполне допустима. Когда создается параметр типа params, он восприни­мает список аргументов переменной длины или же массив, содержащий аргументы.

Несмотря на то что параметру типа params может быть передано любое число аргументов, все они должны иметь тип массива, указываемый этим параметром. Например, вызов метода MinVal()

min = ob.MinVal(1, 2.2); // Неверно!

считается недопустимым, поскольку нельзя автоматически преобразовать тип double (значение 2.2) в тип int, указанный для массива nums в методе MinVal().

Пользоваться модификатором params следует осторожно, соблюдая граничные условия, так как параметр типа params может принимать любое число аргументов - даже нулевое! Например, вызов метода MinVal() в приведенном ниже фрагменте кода считается правильным с точки зрения синтаксиса С#.

min = ob.MinVal(); // нет аргументов

min = ob.MinVal(3); // 1 аргумент

Именно поэтому в методе MinVal() организована проверка на наличие в масси­ве nums хотя бы одного элемента перед тем, как пытаться получить доступ к этому элементу. Если бы такой проверки не было, то при вызове метода MinVal() без аргу­ментов возникла бы исключительная ситуация во время выполнения. Больше того, код метода MinVal() написан таким образом, чтобы его можно было вызывать с одним аргументом. В этом случае возвращается этот единственный аргумент.

У метода могут быть как обычные параметры, так и параметр переменной дли­ны. В качестве примера ниже приведена программа, в которой метод ShowArgs()принимает один параметр типа string, а также целочисленный массив в качестве параметра типа params.

 

// Использовать обычный параметр вместе с параметром

// переменной длины типа params.

 

using System;

 

class MyClass

{

public void ShowArgs(string msg, params int[] nums)

{

Console.Write(msg + ": ");

 

foreach(int i in nums)

Console.Write(i + " ");

 

Console.WriteLine();

}

}

 

class ParamsDemo2 {

static void Main() {

MyClass ob = new MyClass();

 

ob.ShowArgs("Это ряд целых чисел", 

           1, 2, 3, 4, 5);

 

ob.ShowArgs("А это еще два целых числа", 

           17, 20);

}

}

 

Вот какой результат дает выполнение этой программы.

Это ряд целых чисел: 1, 2, 3, 4, 5

А это еще два целых числа: 17, 20

В тех случаях, когда у метода имеются обычные параметры, а также параметр пере­менной длины типа params, он должен быть указан последним в списке параметров данного метода. Но в любом случае параметр типа params должен быть единственным.



2020-03-19 142 Обсуждений (0)
Использование модификатора параметра out 0.00 из 5.00 0 оценок









Обсуждение в статье: Использование модификатора параметра out

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (142)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)