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());
}
Вывод
Ключевое слово 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());
}
Вывод
Ref в сравнении с Out
Ref | Out |
Параметр или аргумент должен быть сначала инициализирован, прежде чем он будет передан в | Инициализация параметра или аргумента перед передачей его в |
Не требуется присваивать или инициализировать значение параметра (который передается по | Вызываемый метод обязан присвоить или инициализировать значение параметра (который передается в |
Передача значения параметра по | Объявление параметра в методе |
Инициализация значения параметра перед его использованием в вызывающем методе не обязательна. | Значение параметра должно быть инициализировано в вызывающем методе перед его использованием. |
Когда мы используем | Когда мы используем |
И | |
Свойства не являются переменными, поэтому они не могут быть переданы в качестве параметра |
Ключевое слово 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;
}
Вывод при компиляции кода:
Однако перегрузка методов возможна, когда один метод принимает аргумент 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
полезны, когда мы хотим вернуть значение в тех же переменных, которые были переданы в качестве аргумента.
Материал подготовлен в рамках специализации «C# Developer». Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь.