Обмен данными между методами
При рассмотрении данного вопроса взаимодействие между методами упрощено – рассматриваем вариант, когда все методы расположены в одном классе.
Существует 3 способа обмена данными:
1. Использование общих полей класса (рассмотренный ранее вариант)
2. Обмен данными через параметры методов
3. Возврат данных из метода
Обмен данными через параметры методов
При вызове метода в скобках помещаются фактические параметры (аргументы метода), которые передаются в метод и там обрабатываются. При определении метода (в его заголовке) указываются формальные параметры, для каждого параметра указывается тип и имя. Значения аргументов будут подставлены вместо параметров (попарно, слева направо). Аргументом может быть любое выражение, тип которого совпадает с типом параметра или может быть автоматически преобразован к типу параметра. При вызове метода вместо формальных параметров его заголовка подставляются фактические. Это похоже на подстановку конкретных чисел в формулу. Сейчас мы рассмотрим ВСЕ виды параметров. На данном этапе не ставится задача изучить перечисляемые способы передачи данных в полном объеме. Это справочная информация.
Виды параметров:
1. Входные (прием данных) – при вызове снимается копия аргумента и передается в метод на место параметра. Метод не имеет возможности изменить аргумент. По умолчанию все параметры считаются входными.
2. Выходные – при вызове в метод передается ссылка на область памяти, где хранится аргумент. Метод обрабатывает данные по этой ссылке, т.е. работает с оригиналом аргумента. Выходные параметры при определении метода и вызове метода должны иметь модификатор out.
3. Входные - выходные – по механизму реализации аналогичны выходным параметрам, но вызывающий метод в обязательном порядке должен определить значение метода. Выходные параметры при определении метода и вызове метода должны иметь модификатор ref.
На практике школьнику достаточно освоить передачу переменных и констант по значению и массивов по ссылке.
Почему передача массивов производится о ссылке? Ссылка – это адрес ячейки памяти, куда помещается первый элемент массива с индексом 0. Массивы, как вы уже знаете, располагаются в памяти в непрерывной области (в подряд идущих ячейках). Поэтому нам достаточно знать адрес начала массива, а потом индексировать его, смещаясь на длину одного элемента внутри выделенной памяти. Нет нужды передавать в метод все элементы массива. Иногда мы называем имя массива ссылкой на его начало в памяти ЭВМ.
Переменные и константы передаются как правило по значению. В стеке копируется их значение и используется методом. А первоначальное значение остается неизменным. Можно их передавать и о ссылке (т.е. не само значение, а адрес ячейки памяти). Для передачи адреса и служат ref и out. Не всегда стоит допускать метод «хозяйничать» в ячейках, поэтому основным способом передачи данных в метод остается передача по значению.
Пример:
Определить метод, выполняющий сдвиг координат точки на заданное расстояние.
class_Example
{
Public_static_void_Mov (ref int x, ref int y, int d)
{
x=x+d;
y=y+d;
}
public_static_void_Main()
{
int a=4, b=3, d=10;
Move (ref a, ref b, d);
}
}
В примере метод не возвращает значение, в него по ссылке передаются две переменные и одна по значению. Переменные меняют значение в результате вычислений внутри метода. Так как они переданы по ссылке, то замена старого значения переменных на новое производится в ячейке памяти. Исходные данные теряются. А теперь попробуйте добавить оператор вывода на экран переменных после вызова метода. Вы получите значения 14 и 13 соответственно вместо 4 и 3.
Теперь рассмотрим ту же программу, но с передачей данных по значению.
class_Example
{