<p id="AutBody_Root154">Стандартное поведение передачи параметров</p>

Когда параметр не имеет модификатора, поведение для типов значений предусматривает передачу параметра по значению, а для ссылочных типов — по ссылке.

На заметку! Типы значений и ссылочные типы рассматриваются позже в главе.

<p id="AutBody_Root155">Стандартное поведение для типов значений</p>

По умолчанию параметр типа значения передается функции по значению. Другими словами, если параметр не помечен каким-либо модификатором, то в функцию передается копия данных. Добавьте в класс 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

<p id="AutBody_Root156">Стандартное поведение для ссылочных типов</p>

Стандартный способ, которым параметр ссылочного типа отправляется функции, предусматривает передачу по ссылке для его свойств, но передачу по значению для него самого. Детали будут представлены позже в главе после объяснения типов значений и ссылочных типов.

На заметку! Несмотря на то что строковый тип данных формально относится к ссылочным типам, как обсуждалось в главе 3, он является особым случаем. Когда строковый параметр не имеет какого-либо модификатора, он передается по значению.

<p id="AutBody_Root157">Использование модификатора out (обновление в версии 7.0)</p>

Теперь мы рассмотрим выходные параметры. Перед покиданием области видимости метода, который был определен для приема выходных параметров (посредством ключевого слова 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);

Перейти на страницу:

Похожие книги