Выходные параметры
METANIT.COM
Сайт о программировании
Существует два способа передачи параметров в метод в языке C#: по значению и по ссылке.
Наиболее простой способ передачи параметров представляет передача по значению, по сути это
обычный способ передачи параметров:
class Program
{
static void Main(string[] args)
{
Sum(10, 15); // параметры передаются по значению
Console.ReadKey();
}
static int Sum(int x, int y)
{
return x + y;
}
}
Console.ReadLine();
}
// параметр x передается по ссылке
static void Addition(ref int x, int y)
https://metanit.com/sharp/tutorial/2.27.php 1/6
18.03.2021 C# и .NET | Параметры по ссылке и значению. Выходные параметры
{
x += y;
}
Обратите внимание, что модификатор ref указывается, как при объявлении метода, так и при его
вызове в методе Main.
В чем отличие двух способов передачи параметров? При передаче по значению метод получает не
саму переменную, а ее копию. А при передаче параметра по ссылке метод получает адрес
переменной в памяти. И, таким образом, если в методе изменяется значение параметра,
передаваемого по ссылке, то также изменяется и значение переменной, которая передается на его
место.
class Program
{
static void Main(string[] args)
{
int a = 5;
Console.WriteLine($"Начальное значение переменной a = {a}");
Консольный вывод:
IncrementVal: 6
равна = 5
При вызове метод IncrementVal получает копию переменной a и увеличивает значение этой копии.
Поэтому в самом методе IncrementVal мы видим, что значение параметра x увеличилось на 1, но
после выполнения метода переменная a имеет прежнее значение - 5. То есть изменяется копия, а
сама переменная не изменяется.
https://metanit.com/sharp/tutorial/2.27.php 2/6
18.03.2021 C# и .NET | Параметры по ссылке и значению. Выходные параметры
class Program
{
static void Main(string[] args)
{
int a = 5;
Console.WriteLine($"Начальное значение переменной a = {a}");
//Передача переменных по ссылке
//После выполнения этого кода a = 6, так как мы передали саму переменную
IncrementRef(ref a);
Console.WriteLine($"Переменная a после передачи ссылке равна = {a}");
Console.ReadKey();
}
// передача по ссылке
static void IncrementRef(ref int x)
{
x++;
Console.WriteLine($"IncrementRef: {x}");
}
}
Консольный вывод:
IncrementRef: 6
равна = 6
В метод IncrementRef передается ссылка на саму переменную a в памяти. И если значение параметра
в IncrementRef изменяется, то это приводит и к изменению переменной a, так как и параметр и
переменная указывают на один и тот же адрес в памяти.
Выше мы использовали входные параметры. Но параметры могут быть также выходными. Чтобы
сделать параметр выходным, перед ним ставится модификатор out:
Здесь результат возвращается не через оператор return, а через выходной параметр. Использование
в программе:
int z;
https://metanit.com/sharp/tutorial/2.27.php 3/6
18.03.2021 C# и .NET | Параметры по ссылке и значению. Выходные параметры
Console.WriteLine(z);
Console.ReadKey();
}
Причем, как и в случае с ref ключевое слово out используется как при определении метода, так и
при его вызове.
Также обратите внимание, что методы, использующие такие параметры, обязательно должны
присваивать им определенное значение. То есть следующий код будет недопустим, так как в нем для
out-параметра не указано никакого значения:
Прелесть использования подобных параметров состоит в том, что по сути мы можем вернуть из
метода не один вариант, а несколько. Например:
Console.ReadKey();
}
static void GetData(int x, int y, out int area, out int perim)
{
area= x * y;
perim= (x + y)*2;
}
Здесь у нас есть метод GetData, который, допустим, принимает стороны прямоугольника. А два
выходных параметра мы используем для подсчета площади и периметра прямоугольника.
По сути, как и в случае с ключевым словом ref, ключевое слово out применяется для передачи
аргументов по ссылке. Однако в отличие от ref для переменных, которые передаются с ключевым
словам out, не требуется инициализация. И кроме того, вызываемый метод должен обязательно
присвоить им значение.
Стоит отметить, что начиная с версии C# 7.0 можно определять переменные в непосредственно при
вызове метода. То есть вместо:
int x = 10;
int area;
int perimetr;
GetData(x, 15, out area, out perimetr);
Console.WriteLine($"Площадь : {area}");
Console.WriteLine($"Периметр : {perimetr}");
https://metanit.com/sharp/tutorial/2.27.php 4/6
18.03.2021 C# и .NET | Параметры по ссылке и значению. Выходные параметры
Мы можем написать:
int x = 10;
GetData(x, 15, out int area, out int perimetr);
Console.WriteLine($"Площадь : {area}");
Console.WriteLine($"Периметр : {perimetr}");
Кроме выходных параметров с модификатором out метод может использовать входные параметры с
модификатором in. Модификатор in указывает, что данный параметр будет передаваться в метод по
ссылке, однако внутри метода его значение параметра нельзя будет изменить. Например, возьмем
следующий метод:
static void GetData(in int x, int y, out int area, out int perim)
{
// x = x + 10; нельзя изменить значение параметра x
y = y + 10;
area = x * y;
perim = (x + y) * 2;
}
В данном случае через параметры x и y в метод передаются значения, но в самом методе можно
изменить только значение параметра y, так как параметр x указан с модификатором in.
Дополнительные материалы
https://metanit.com/sharp/tutorial/2.27.php 5/6
18.03.2021 C# и .NET | Параметры по ссылке и значению. Выходные параметры
Помощь сайту
WebMoney
P378451176208
Z280152397659
Yandex-деньги
410011174743222
PayPal
metanit22@mail.ru
Перевод на карту
https://metanit.com/sharp/tutorial/2.27.php 6/6