ref в сравнении с out в C#

Kate

Administrator
Команда форума
C# ref в сравнении с out

Ключевые слова Ref и out в C# используются для передачи аргументов внутри метода или функции. Оба слова указывают на то, что аргумент/параметр передается по ссылке. По умолчанию параметры передаются в метод по значению. Используя эти ключевые слова (ref и out), мы можем передать параметр по ссылке.

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

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

Пример кода

public static string GetNextName(ref int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
static void Main(string[] args)
{
int i = 1;
Console.WriteLine("Previous value of integer i:" + i.ToString());
string test = GetNextName(ref i);
Console.WriteLine("Current value of integer i:" + i.ToString());
}
Вывод

d0dadde6d9c2a91388fdde0633063623.jpg

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

Ключевое слово out передает аргументы по ссылке. Это очень похоже на ключевое слово ref.

Пример кода

public static string GetNextNameByOut(out int id)
{
id = 1;
string returnText = "Next-" + id.ToString();
return returnText;
}
static void Main(string[] args)
{
int i = 0;
Console.WriteLine("Previous value of integer i:" + i.ToString());
string test = GetNextNameByOut(out i);
Console.WriteLine("Current value of integer i:" + i.ToString());
}
Вывод

79849fa85abe6f0ad44016deb4bab0bd.png

Ref в сравнении с Out

RefOut
Параметр или аргумент должен быть сначала инициализирован, прежде чем он будет передан в ref.Инициализация параметра или аргумента перед передачей его в out не является обязательной.
Не требуется присваивать или инициализировать значение параметра (который передается по ref) перед возвратом в вызывающий метод.Вызываемый метод обязан присвоить или инициализировать значение параметра (который передается в out) перед возвратом в вызывающий метод.
Передача значения параметра по Ref полезна, когда вызываемый метод также должен модифицировать передаваемый параметр.Объявление параметра в методе out полезно, когда из функции или метода необходимо вернуть несколько значений.
Инициализация значения параметра перед его использованием в вызывающем методе не обязательна.Значение параметра должно быть инициализировано в вызывающем методе перед его использованием.
Когда мы используем REF, данные могут передаваться двунаправленно.Когда мы используем OUT, данные передаются только однонаправленно (от вызываемого метода к вызывающему методу).
И ref, и out по-разному обрабатываются во время выполнения программы, а во время компиляции они обрабатываются одинаково.
Свойства не являются переменными, поэтому они не могут быть переданы в качестве параметра out или ref.
Ключевое слово Ref / Out и перегрузка методов

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

Пример кода

public static string GetNextName(ref int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
public static string GetNextName(out int id)
{
id = 1;
string returnText = "Next-" + id.ToString();
return returnText;
}
Вывод при компиляции кода:

fc81b56056d3ae18e70c7fe2263c54c7.png

Однако перегрузка методов возможна, когда один метод принимает аргумент ref или out, а другой принимает тот же аргумент без ref или out.

Пример кода

public static string GetNextName(int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
public static string GetNextName(ref int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
Резюме

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

 
Сверху