День сто семнадцатый. #ВопросыНаСобеседовании
Самые часто задаваемые вопросы на собеседовании по C#
7. В чем разница между ключевыми словами ref и out?
Ключевые слова
Ref
Ключевое слово
Ключевое слово out возвращает аргумент из метода по ссылке. Оно очень похоже на ключевое слово
Ref
1. Параметр или аргумент должен быть инициализирован, прежде чем он передаётся в
2. Не требуется присваивать или инициализировать значение параметра (переданного с помощью
3. Передача значения параметра с помощью
4. При использовании
Out
1. Не обязательно инициализировать параметр или аргумент перед его передачей в
2. Вызываемый метод обязан присвоить или инициализировать значение параметра (переданного с помощью
3. Передача значения параметра с помощью
4. При использовании
Сходства
1. И
2. Свойства не являются переменными, поэтому их нельзя передавать как параметр
Перегрузка методов
Допустима перегрузка методов, если один метод принимает параметры по значению, а другой по ссылке с помощью
Источник: https://www.c-sharpcorner.com
Самые часто задаваемые вопросы на собеседовании по 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:1Out
Next-1
Current value of i:2
Ключевое слово 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