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

  • docx
  • 27.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-003003.docx

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

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

 

private void Calc(int Number)

{

Number = 10;

}

 

Видно, что внутри метода происходит изменение переменной Number, которая была передана как параметр. Попробуем вызвать ме- тод:

 

int n = 1; Calc(n);

MessageBox.Show(n.ToString());

 

На экране появится число 1, то есть, не смотря на изменение пере- менной в методе Calc, значение переменной в главной программе не изменилось. Это связано с тем, что при вызове метода создаётся копия переданной переменной, именно её изменяет метод. При завершении метода значение копий теряется. Такой способ передачи параметра называется передачей по значению.

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

 

private void Calc(ref int Number)

{

Number = 10;

}

 

int n = 1; Calc(ref n);

MessageBox.Show(n.ToString());


В этом случае на экране появится число 10: изменение значения в методе сказалось и на главной программе. Такая передача метода назы- вается передачей по ссылке, т.е. передаётся уже не копия, а ссылка на реальную переменную в памяти.

Если метод использует переменные по ссылке только для возврата значений и не имеет значения что в них было изначально, то можно не инициализировать такие переменные, а передавать их с ключевым сло- вом out. Компилятор понимает, что начальное значение переменной не важно и не ругается на отсутствие инициализации:

 

private void Calc(out int Number)

{

Number = 10;

}

 

int n; // Ничего не присваиваем! Calc(out n);