Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Понятие параметров метода. Выходные параметры. Примеры использования.




Параметры-значения

Параметр-значение указывается в заголовке метода своим типом и именем. Имя параметра может быть произвольным. Параметр-значение представляет собой локальную переменную, которая получает свое значение из вызывающего блока при вызове метода. Например, заголовок метода, имеющего один параметр-значение целого типа, может иметь вид:

void В(int z);

При вызове метода на месте параметра-значения можно использовать любое выражение (его частные случаи — переменная или константа), для которого должно существовать неявное преобразование типа выражения к типу параметра.

Например, пусть в вызывающей функции описаны переменные и им до вызова метода присвоены значения:

int х = 1;

sbyte с = 1;

Тогда вызов метода В, заголовок которого был описан ранее, может быть осуществлен, например, так:

В(х); В(с); В(10); В(х + 2*с);

Отличительной чертой параметров-значений является следующее: при вызове метода из ячейки памяти, в которой хранится переменная, передаваемая в метод, берется ее значение и копируется в специальную область памяти. По завершении работы метода область параметров освобождается.

Всевозможные действия над этими параметрами внутри метода никак не отражаются на значениях переменных вне его. Происходит это потому, что, как было сказано выше, параметры-значения передаются в метод в виде копий, над которыми и производятся различные действия, а значения самих переменных в вызывающем блоке остаются неизменными. Это означает, что передача параметров по значению возможна только для тех параметров, которые являются исходными данными для метода. Такой способ передачи не позволяет вернуть его результат работы в вызывающий блок.

Основное достоинство способа передачи параметров по значению — защита значений переменных в вызывающем блоке от непреднамеренных изменений. Недостаток его — увеличение объёма используемой памяти.

Параметры-ссылки

Передача по ссылке является вторым способом передачи параметров. В таком случае в метод передается ссылка на аргумент, а не сам аргумент. Следует учитывать, что сама ссылка передается по значению, то есть копируется. Внутри метода эта ссылка используется для доступа к области памяти, в которой хранится аргумент. Такая передача называется передачей «по ссылке», а параметры, переданные посредством ссылки, называются параметрами-переменными или параметрами - ссылками.

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

Именно по этой причине использовать параметры-переменные при организации методов необходимо с большой осторожностью, поскольку посредством такого параметра всегда можно непреднамеренно испортить переменную из вызывающего блока. Исходя из сказанного, рекомендуется применять параметр-переменную только в тех случаях, когда действительно необходимо вернуть из метода результат.

Способ передачи параметра по адресу устанавливает программист в заголовке метода следующим образом: имени параметра-ссылки в заголовке метода перед описанием параметра должно предшествовать ключевое слово ref:

Ref тип имя

Пример заголовка метода, имеющего один параметр-ссылку целого типа: void В(ref int z);

Строго говоря, методы, которые результатом своей работы имеют лишь одну величину, возвращают ее в вызывающий блок с помощью оператора return. Этот вариант намного проще, так как не требует работы с параметрами-ссылками.

Параметры-ссылки рекомендуется использовать лишь в тех случаях, когда метод должен возвращать более одной величины, или если в методе требуется изменить значения каких-либо передаваемых в него величин.

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

Проиллюстрируем передачу параметров-значений и параметров-ссылок на примере (листинг 3).

Листинг 3- Параметры-значения и параметры-ссылки

using System;

namespace ConsoleApplication3

{

class Program

{

static void Prim(int w, ref int z)

{

w = 5; z = w;

Console.WriteLine("внутри метода Prim: w="+w+" z="+z);

}

static void Main()

{

int w = 1, z = 2;

Console.WriteLine("до вызова Prim: w=" + w + " z=" + z);

Prim(w, ref z);

Console.WriteLine("после завершения работы Prim: w=" + w + " z=" + z);

}

}

}

 

Суть этой простой программы заключается в следующем: в методе Main задаются начальные значения двух переменных int w = 1, z = 2;

Затем вызывается объявленный ранее в данном классе метод Prim, в котором значения переменных становятся равными: w = 5; z = w;

После завершения работы метода Prim вновь проверяются значения переменных.

Результаты работы этой программы:

Как легко увидеть, значение переменной w и до и после работы метода Prim одно и то же, оно не изменилось, поскольку переменная передавалась по значению, а значение переменной z изменилось потому, что она была передана по ссылке.

Несколько иная картина получится, если передавать в метод не величины значимых типов, а экземпляры классов, то есть величины ссылочных типов. Как вы помните, переменная-объект на самом деле хранит ссылку на данные, расположенные в динамической памяти, и именно эта ссылка передается в метод либо по адресу, либо по значению. В обоих случаях метод получает в свое распоряжение фактический адрес данных и, следовательно, может их изменить.

Для простоты можно считать, что объекты всегда передаются по ссылке. Разница между передачей объектов по значению и по ссылке состоит в том, что в последнем случае можно изменить саму ссылку, то есть после вызова метода она может указывать на другой объект.

Выходные параметры

Довольно часто возникает необходимость в методах, которые сами формируют несколько величин, например, если в методе создаются объекты или инициализируются ресурсы. В этом случае становится неудобным ограничение параметров-ссылок: необходимость присваивания значения аргументу до вызова метода. Это ограничение снимает спецификатор out. Параметру, имеющему этот спецификатор, должно быть обязательно присвоено значение внутри метода, компилятор за этим следит. Зато в вызывающем коде можно ограничиться описанием переменной без инициализации.

Изменим описание второго параметра в листинге 4 так, чтобы он стал выходным.

Листинг 4- Выходные параметры

using System;

namespace ConsoleApplication1

{ class Class1

{static void P(int a, out int b)

{

а = 44; b = 33;

Сonsole.WriteLine("внутри метода {0} {1}", a, b);

}

static void Main()

{

int a = 2, b;

Р(a, out b);

Соnsole.WriteLine("после вызова {0} {1}", a, b);

}

}

}

При вызове метода перед соответствующим параметром тоже указывается ключевое слово оut.

В списке параметров записывайте сначала все входные параметры, затем — все ссылки и выходные параметры.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных