Полная версия

Главная arrow Информатика arrow Введение в программирование на языке Visual C#

  • Увеличить шрифт
  • Уменьшить шрифт


<<   СОДЕРЖАНИЕ   >>

Передача параметров: по ссылке или по значению

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

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

могут быть одинаковы или, наоборот, различаться.

Параметры передаются двумя способами:

  • - по значению;
  • - по ссылке.

При передаче параметров по значению передаются только копии переменных, выступающих в качестве параметров метода. Такой способ передачи параметров используется по умолчанию. Посмотрим, как изменяются значения переменных х и у из листингов 126, 127 до вызова метода Square и после. Для этого немного изменим соответствующие листинги.

Листинг 130

namespace WindowsApplicationl {

class Classl {

public static int Square(int x, int y)

{

x = 10;

У = 20;

int c = x*x + y*y; return c;

}

}

}

namespace WindowsApplicationl {

public partial dass Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

int x — 5; int у = 5;

label2.Text = "x= " + x.ToString() + " " + "y= " +

у.ToString();

label4.Text = Classl.Square(x, у).ToString(); label6.Text = "x= " + x.ToString() + " " + "y= " +

у.ToString();

}

}

}

Результат работы программы представлен на рис. 150.

Значения переменных хну остались неизменными

Рис. 150. Значения переменных хну остались неизменными

Из рис. 150 видно, что значения переменных х и у остались неизменными, несмотря на то что была предпринята попытка изменить их значения в методе Square. Это произошло потому, что в метод были переданы копии переменных х и у. В методе они претерпели изменения (х = 10, у = 20), но после вызова метода их значения остались прежними (х = 5, у = 5).

Передача параметров по ссылке открывает доступ к области памяти, где хранится содержимое переменной. В результате метод может изменять значение переменной, являющейся ее параметром. Для обозначения параметра, передаваемого по ссылке, служит модификатор ref (англ, reference — ссылка). В следующей задаче (см. листинг 132) создадим метод Plata, который будет рассчитывать оклад абстрактного сотрудника, заработная плата которого зависит от количества отработанных часов. Обратим внимание на заголовок метода Plata, в котором присутствуют ключевое слово void и три ссылочных параметра hours (часы), oklad (оплата за час) и pay (заработная плата). Для того чтобы отследить изменения, которые будут происходить с параметрами метода до и после его вызова, прежде чем вычислить заработную плату, уменьшим количество часов и стоимость часа вдвое.

namespace WindowsApplicationl {

class Classl {

public static void Plata(ref int hours,ref int oklad, ref int pay) {

hours = hours / 2; oklad = oklad / 2; pay - hours * oklad;

}

}

}

В основной части программы (см. листинг 133), во-первых, необходимо инициализировать все ссылочные параметры, в противном случае компилятор будет выдавать сообщение об ошибке. Во-вторых, ранее говорилось о том, что метод возвращает результат в точку вызова (для этого в методе использовался оператор return), таким образом, предполагалось, что результат может быть единственным. Здесь это ограничение снято, и метод Plata при его вызове не возвращает результат, а выполняет последовательность операторов. В-третьих, метод Plata изменяет значения переданных в него параметров, что видно из результатов работы программы, отображенных на рис. 151. Это свидетельство того, что метод работает не с копиями значений переменных, а с их действительными значениями.

Листинг 133

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

int hours = 10; int oklad = 400; int pay = 0;

label2.Text = hours.ToString() + " " + oklad.ToString();

Classl.Plata(ref hours,ref oklad, ref pay) ; label4.Text = pay.ToString();

label6.Text = hours.ToString() + " " + oklad.ToString();

}

}

Результат работы программы представлен на рис. 151.

Значения переменных хну уменьшились вдвое

Рис. 151. Значения переменных хну уменьшились вдвое

Как было отмечено выше, при использовании ссылочных параметров необходимо инициализировать начальные значения переменных перед передачей их в метод. Такое ограничение снимается, если использовать в обозначении выходного параметра модификатор out (англ, output — выходной). Сами же значения переменных можно передать в метод при его вызове. При вызове метода соответствующий параметр также должен быть обозначен как выходной. В листинге 134, как и ранее, метод Square служит для нахождения суммы квадратов двух чисел, а в листинге 135 три раза происходит его вызов с разными входными параметрами.

Листинг 134

namespace WindowsApplicationl

{

class Classl

{

public static void Square(int x, int y, out int c)

{

c = x*x + y*y;

}

}

}

Листинг 135

namespace WindowsApplicationl

{

public partial dass Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

int c ;

Classl.Square(10, 20, out с); //Результат равен 500 labeil. Text = c.ToStringO;

Classl.Square(20, 40, out с); //Результат равен 2000 label2.Text = c.ToStringO;

Classl.Square(30, 60, out с); //Результат равен 4500 label3.Text = c.ToStringO;

}

}

Результат работы программы представлен на рис. 152.

Вызов метода с модификатором out

Рис. 152. Вызов метода с модификатором out

 
<<   СОДЕРЖАНИЕ   >>