Console.WriteLine("***** Fun with Methods *****");
// Присваивать начальные значения локальным переменным, используемым
// как выходные параметры, не обязательно при условии, что они
// применяются в таком качестве впервые.
// Версия C# 7 позволяет объявлять параметры out в вызове метода.
AddUsingOutParam(90, 90, out int ans);
Console.WriteLine("90 + 90 = {0}", ans);
Console.ReadLine;
Предыдущий пример по своей природе предназначен только для иллюстрации; на самом деле нет никаких причин возвращать значение суммы через выходной параметр. Тем не менее, модификатор out в C# служит действительно практичной цели: он позволяет вызывающему коду получать несколько выходных значений из единственного вызова метода:
// Возвращение множества выходных параметров.
static void FillTheseValues(out int, out string b, out bool c)
{
a = 9;
b = "Enjoy your string.";
c = true;
}
Теперь вызывающий код имеет возможность обращаться к методу FillTheseValues
. Не забывайте, что модификатор out
должен применяться как при вызове, так и при реализации метода:
Console.WriteLine("***** Fun with Methods *****");
FillTheseValues(out int i, out string str, out bool b);
Console.WriteLine("Int is: {0}", i); // Вывод целочисленного значения
Console.WriteLine("String is: {0}", str); // Вывод строкового значения
Console.WriteLine("Boolean is: {0}", b); // Вывод булевского значения
Console.ReadLine;
На заметку! В версии C# 7 также появились кортежи, представляющие собой еще один способ возвращения множества значений из вызова метода. Они будут описаны далее в главе.
Всегда помните о том, что перед выходом из области видимости метода, определяющего выходные параметры, этим параметрам
static void ThisWontCompile(out int a)
{
Console.WriteLine("Error! Forgot to assign output arg!");
// Ошибка! Забыли присвоить значение выходному параметру!
}
Отбрасывание параметров out (нововведение в версии 7.0)
Если значение параметра out
не интересует, тогда в качестве заполнителя можно использовать отбрасывание. Отбрасывания представляют собой временные фиктивные переменные, которые намеренно не используются. Их присваивание не производится, они не имеют значения и для них может вообще не выделяться память. Отбрасывание способно обеспечить выигрыш в производительности, а также сделать код более читабельным. Его можно применять с параметрами out
, кортежами (как объясняется позже в главе), сопоставлением с образцом (см. главы 6 и 8) или даже в качестве автономных переменных.
Например, если вы хотите получить значение для int
в предыдущем примере, но остальные два параметра вас не волнуют, тогда можете написать такой код:
// Здесь будет получено значение только для а;
// значения для других двух параметров игнорируются.
FillTheseValues(out int a, out _, out _);
Обратите внимание, что вызываемый метод по-прежнему выполняет работу, связанную с установкой значений для всех трех параметров; просто последние два параметра
Модификатор out в конструкторах и инициализаторах (нововведение в версии 7.3)
В версии C# 7.3 были расширены допустимые местоположения для использования параметра out
. В дополнение к методам параметры конструкторов, инициализаторы полей и свойств, а также конструкции запросов можно декорировать модификатором out
. Примеры будут представлены позже в главе.
Использование модификатора ref
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT