Стандартное поведение передачи параметров
Когда параметр не имеет модификатора, поведение для типов значений предусматривает передачу параметра по значению, а для ссылочных типов — по ссылке.
На заметку! Типы значений и ссылочные типы рассматриваются позже в главе.
Стандартное поведение для типов значений
По умолчанию параметр типа значения передается функции Program
следующий метод, который оперирует с двумя параметрами числового типа, передаваемыми по значению:
// По умолчанию аргументы типов значений передаются по значению.
static int Add(int x, int y)
{
int ans = x + y;
// Вызывающий код не увидит эти изменения,
// т.к. модифицируется копия исходных данных
// original data.
x = 10000;
y = 88888;
return ans;
}
Числовые данные относятся к категории
Console.WriteLine("***** Fun with Methods *****\n");
// Передать две переменные по значению.
int x = 9, y = 10;
Console.WriteLine("Before call: X: {0}, Y: {1}", x, y);
// Значения перед вызовом
Console.WriteLine("Answer is: {0}", Add(x, y));
// Результат сложения
Console.WriteLine("After call: X: {0}, Y: {1}", x, y);
// Значения после вызова
Console.ReadLine();
Как видно в показанном далее выводе, значения х
и у
вполне ожидаемо остаются идентичными до и после вызова метода Add()
, поскольку элементы данных передавались по значению. Таким образом, любые изменения параметров, производимые внутри метода Add()
, вызывающему коду не видны, т.к. метод Add()
оперирует на копии данных.
***** Fun with Methods *****
Before call: X: 9, Y: 10
Answer is: 19
After call: X: 9, Y: 10
Стандартное поведение для ссылочных типов
Стандартный способ, которым параметр ссылочного типа отправляется функции, предусматривает
На заметку! Несмотря на то что строковый тип данных формально относится к ссылочным типам, как обсуждалось в главе 3, он является особым случаем. Когда строковый параметр не имеет какого-либо модификатора, он передается по значению.
Использование модификатора out (обновление в версии 7.0)
Теперь мы рассмотрим выходные out
), им должны присваиваться соответствующие значения (иначе компилятор сообщит об ошибке). В целях демонстрации ниже приведена альтернативная версия метода AddUsingOutParam()
, которая возвращает сумму двух целых чисел с применением модификатора out
(обратите внимание, что возвращаемым значением метода теперь является void
):
// Значения выходных параметров должны быть
// установлены внутри вызываемого метода.
static void AddUsingOutParam(int x, int y, out int ans)
{
ans = x + y;
}
Вызов метода с выходными параметрами также требует использования модификатора out
.Однако предварительно устанавливать значения локальных переменных, которые передаются в качестве выходных параметров, вовсе не обязательно (после вызова эти значения все равно будут утрачены). Причина, по которой компилятор позволяет передавать на первый взгляд неинициализированные данные, связана с тем, что вызываемый метод AddUsingOutParam()
, создайте переменную типа int
и примените в вызове модификатор out
:
int ans;
AddUsingOutParam(90, 90, out ans);