День сто семнадцатый. #ВопросыНаСобеседовании

Самые часто задаваемые вопросы на собеседовании по C#

7. В чем разница между ключевыми словами ref и out?

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



Ref

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

public static string GetNextName(ref int id)

{

string returnText = "Next-" + id;

id += 1;

return returnText;

}

static void Main(string[] args)

{

int i = 1;

Console.WriteLine("Previous value of i:" + i);

string test = GetNextName(ref i);

Console.WriteLine(test);

Console.WriteLine("Current value of i:" + i);

Console.ReadLine();

}

Вывод:

Previous value of i:1

Next-1

Current value of i:2



Out

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

public static string GetNextName(out int id)

{

id = 1;

string returnText = "Next-" + id;

return returnText;

}

static void Main(string[] args)

{

int i;

string test = GetNextName(out i);

Console.WriteLine(test);

Console.WriteLine("Current value of i:" + i);

Console.ReadLine();

}

Вывод:

Next-1

Current value of i:1



Отличия

Ref

1. Параметр или аргумент должен быть инициализирован, прежде чем он передаётся в ref.

2. Не требуется присваивать или инициализировать значение параметра (переданного с помощью ref) внутри вызываемого метода перед возвратом в вызывающий метод.

3. Передача значения параметра с помощью ref полезна, когда вызываемый метод также необходим для изменения переданного параметра.

4. При использовании ref, данные могут передаваться в двух направлениях.



Out

1. Не обязательно инициализировать параметр или аргумент перед его передачей в out.

2. Вызываемый метод обязан присвоить или инициализировать значение параметра (переданного с помощью out) перед возвратом в вызывающий метод.

3. Передача значения параметра с помощью out полезна, когда из функции или метода необходимо вернуть несколько значений.

4. При использовании out, данные передаются только однонаправленно (от вызываемого метода к вызывающему).



Сходства

1. И ref, и out ведут себя по-разному во время выполнения, но они трактуются одинаково при компиляции.

2. Свойства не являются переменными, поэтому их нельзя передавать как параметр 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;

}

При компиляции этого кода будет выброшено исключение: "Сannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'" ("Нельзя определить перегруженные методы, которые отличаются только модификаторами 'out' и 'ref'").



Источник: https://www.c-sharpcorner.com