воскресенье, 9 января 2022 г.

Операторы ref и out

 Передача параметров в метод по ссылке. Операторы ref и out


В C# значения переменных по-умолчанию передаются по значению (в метод передается локальная копия параметра, который используется при вызове). 

Это означает, что мы не можем внутри метода изменить параметр из вне:

public static void ChangeValue(object a)
{
   a = 2;
}

static void Main(string[] args)
{
   int a = 1;
   ChangeValue(a);
   Console.WriteLine(a); // 1
   Console.ReadLine();
}

Чтобы передавать параметры по ссылке, и иметь возможность влиять на внешнюю переменную, используются ключевые слова ref и out.


Ключевое слово ref


Чтобы использовать ref, это ключевое слово стоит указать перед типом параметра в методе, и перед параметром при вызове метода:

public static void ChangeValue(ref int a)
{
   a = 2;
}
static void Main(string[] args)
{
   int a = 1;
   ChangeValue(ref a);
   Console.WriteLine(a); // 2
   Console.ReadLine();
}

В этом примере мы изменили значение внешней переменной внутри метода.

Особенностью ref является то, что переменная, которую мы передаем в метод, обязательно должна быть проинициализирована значением, иначе компилятор выдаст ошибку «Use of unassigned local variable 'a'». Это является главным отличием ref от out.

Лучше так, а то путаете людей

class Program
{
static void Main(string[] args)
{
int a = 1;
ChangeValue(ref a);
Console.WriteLine(a); // 2
Console.ReadLine();
}
public static void ChangeValue(ref int v)
{
v = 2;
}
}


Ключевое слово out

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

public static void ChangeValue(out int a)
{
   a = 2;
}
static void Main(string[] args)
{
   int a;
   ChangeValue(out a);
   Console.WriteLine(a); // 2
   Console.ReadLine();
}

Если не присвоить новое значение параметру out, мы получим ошибку «The out parameter 'a' must be assigned to before control leaves the current method»

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...