Стандартное поведение для типов значений
По умолчанию параметр типа значения передается функции 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);
Начиная с версии C# 7.0, больше нет нужды объявлять параметры out
до их применения. Другими словами, они могут объявляться внутри вызова метода:
AddUsingOutParam(90, 90, out int ans);
В следующем коде представлен пример вызова метода с встраиваемым объявлением параметра out
:
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT