Урок 7. Использование ref и out аргументов в методах

Параметры принято разделять на формальные параметры и фактические параметры.

Параметры, указываемые при описании метода, называются формальными, а параметры, указываемые при его вызове – фактическими.

В C# параметры также делят на две категории:

  1. те что при запуске метода, создают копию полученных данных (соответственно их дальнейшее изменение не будет влиять на оригинал)
  2. те что при запуске метода, работают с полученными данными напрямую не создавая копии (изменения полученных данных приведёт к их изменению в оригинале)

Зачастую в методы передают различные значения с помощью переменных, при передачи данных через 1 категорию параметров – любые их изменения в методе не повлияют на значение записанное в переменной, а при передаче данных через 2 категорию параметров – любые изменения будут влиять и на содержимое переменной.

1 категорию параметров также называют входными (in) параметрами и все параметры в C# изначально ими и являются, но при этом язык C# не поддерживает использования ключевого слова in для входных параметров (оно стоит там по умолчанию и его указывать ненужно).

2ю категорию параметров делят на два типа:

  • изменяемые (ref)
  • выходные (out)

Рекомендуется передавать параметры в метод в следующей последовательности: сначала входные параметры in, потом изменяемые ref и в конце выходные out.

Ключевое слово ref используется для передачи аргументов в метод по ссылке. В результате все изменения параметра в методе будут отражены в переменной при передаче элемента управления обратно в вызывающий метод. Для работы с параметром ref вызывающий метод должен явно использовать ключевое слово ref при передаче аргумента в метод. Аргумент, передаваемый в параметр ref, сначала следует инициализировать.

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

Несмотря на то что переменные, передаваемые в качестве аргументов out, могут не инициализироваться перед передачей, вызываемый метод должен присвоить значение перед возвратом метода.

Различия ref и out состоят в cследующем:

  • Аргумент, передаваемый в параметр ref, сначала следует инициализировать (для out это необязательно).
  • параметру типа out перед завершением работы метода нужно присвоить значение (для out это необязательно).
  • поскольку out параметр может быть не проинициализирован, то его использование до инициализации приведёт к ошибке (с ref такого не будет).

Ключевые слова ref и out приводят к разным результатам во время выполнения, однако во время компиляции они не считаются частью сигнатуры метода. Поэтому, если единственное различие между методами заключается в том, что один метод принимает аргумент ref, а другой – out, они не могут быть перегружены.

Опасно использовать передаваемые в метод параметры, как рабочие переменные. Для такой цели создайте локальные переменные.

Старайтесь ограничивать количество параметров примерно семью.

Минимизируйте число возвратов из каждого метода. Тяжело понять логику метода, когда при анализе нижних строк приходится помнить о возможных выходах в верхних строках.

Пример использования изменяемых и выходных параметров в методе:

static void Add(ref int x, ref int y, out int sum)
{
    sum = x + y;
}

static void Main()
{
    Console.WriteLine("Введите 1-e число.");
    
    string operand1 = Console.ReadLine();
    int summand1 = Int32.Parse(operand1);

    Console.WriteLine("Введите 2-e число.");
   
    string operand2 = Console.ReadLine();
    int summand2 = Int32.Parse(operand2);
               
    int sum;

    Add(ref summand1, ref summand2, out sum);

    Console.WriteLine("{0} + {1} = {2}", summand1, summand2, sum);

    // Delay.
    Console.ReadKey();
}

Результат:

9 10

Как видно из примера выше, методы могут иметь несколько исходных/выходных параметров и также все параметры могут быть разных типов (входными, изменяемыми и выходными).

Источник: видеоурок Александра Шевчука "МЕТОДЫ"

%D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BB%D0%B5%D0%B2%D0%BE%202 предыдущая статья | следующая статья %D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%202

Привет. Я разраб периодически готовлю к собеседованиям и собеседую на работе. Решил подработать)) Могу подготовить к собеседованию по c#(в том числе мидлов и сеньоров). Мой телеграм al322se